2017-12-11 5 views
1

すべてのオープンジェネリックタイプをデフォルト規約で登録しようとしています。 以下のようなデフォルトの規約を使用すると、自分のタイプが正しく登録されていることを確認できます。StructureMapはオープンジェネリックをデフォルト規約で正しく登録することができません。

しかし、私はそれを解決しようとすると、次のエラーがスローされます。

んが、デフォルトのインスタンスが登録されていないと、自動的にタイプのために決定することはできませんここにIGenericClass "

public DefaultRegistry() 
     { 
      Scan(
       scan => 
       { 
        scan.AssembliesFromApplicationBaseDirectory(
         a => a.FullName.StartsWith("StructureMapApp")); 
        scan.WithDefaultConventions(); 
       }); 
     } 

var container = new Container(x => 
    { 
     x.AddRegistry(new DefaultRegistry()); 

    }); 
    container.WhatDoIHave(); 

    var result = container.GetInstance<IGenericClass<DummyClass>>(); 

container.WhatDoIHave()結果 container.WhatDoIHaveは(ある)​​

私はそれを登録した場合明示的には期待どおりに動作します。

 container.Configure(x => x.For(typeof(IGenericClass<>)).Use(typeof(GenericClass<>))); 
     var sad = container.GetInstance<IGenericClass<DummyClass>>(); 

ここcontainer.WhatDoIHave()

enter image description here

あなたがそこにある気付くかもしれとして明示しながら、デフォルトの規則で作られた2つのregistries.Theレジストリの間のわずかな差がアセンブリとモデル名を含んを結果は1つは持っていない。

enter image description here

自動明示的にそれらのすべてを提供することなく、開いているすべてのジェネリック医薬品を登録する方法はありますか?

+0

DefaultRegistryは何であるとそれを追加しますか? – Evk

+0

これを追加するのを忘れました、私はそれを追加しました – erhan355

+0

私が知る限り - デフォルトの規約はそうするつもりはありません、あなたはカスタムレジストレーション規約を書く必要があります。 – Evk

答えて

1

私が知る限り、DefaultConventionはそうしていません。しかし、あなたは、たとえば、カスタム規則を作成することができます。

class MapOpenGenericTypesToInterfacesConvention : IRegistrationConvention { 
    public void ScanTypes(TypeSet types, Registry registry) { 
     var openInterfaces = types.FindTypes(TypeClassification.Open | TypeClassification.Interfaces).ToArray(); 
     var openConcrete = types.FindTypes(TypeClassification.Open | TypeClassification.Concretes); 
     foreach (var type in openConcrete) { 
      foreach (var iface in openInterfaces) { 
       if (type.GetInterfaces().Where(c => c.IsGenericType).Any(ti => ti.GetGenericTypeDefinition() == iface)) { 
        registry.For(iface).Use(type); 
       } 
      } 
     } 
    } 
} 

その後

scan.With(new MapOpenGenericTypesToInterfacesConvention()); 
関連する問題