2017-12-31 66 views
1

名前付き/キー解決によっても、名前を使用して子依存性が解決されますか?名前解決は、子依存関係のない解決された型に対してのみ名前/キーを適用しますか?オートファック。ネーミングの解決と子依存性

エラーが発生します。タイプの「Autofac.Core.Activators.Reflection.DefaultConstructorFinder」「ConsoleApplication1.Program + MainClassOne」で見つかったコンストラクタの

なし利用可能なサービスやパラメータを使用して起動することはできない。 コンストラクタ 'Void .ctor(INamed)'のパラメータ 'INamed named'を解決できません。

class Program 
{ 
    static void Main(string[] args) 
    { 
     var container = new ContainerBuilder(); 
     container.RegisterType<NamedB>().Named<INamed>("B"); 
     container.RegisterType<NamedA>().Named<INamed>("A"); 
     container.RegisterType<MainClassOne>().Named<MainClassOne>("A"); 
     container.RegisterType<MainClassTwo>().Named<MainClassTwo>("B"); 

     var di = container.Build(); 
     var a = di.ResolveNamed<MainClassTwo>("B"); 
     var a2 = di.ResolveNamed<MainClassOne>("A"); 

    } 

    public class MainClassOne 
    { 
     public MainClassOne(INamed named) 
     { 
      Console.WriteLine("MainClassOne= " + named.Name); 
     } 
    } 

    public class MainClassTwo 
    { 
     public MainClassTwo(INamed named) 
     { 
      Console.WriteLine("MainClassTwo= " + named.Name); 
     } 
    } 

    public interface INamed 
    { 
     string Name { get; set; } 
    } 

    public class NamedA : INamed 
    { 
     public string Name 
     { 
      get { return "A"; } 
      set { } 
     } 
    } 

    public class NamedB : INamed 
    { 
     public string Name 
     { 
      get { return "B"; } 
      set { } 
     } 
    } 
} 
+1

悲しいですが、解決されたタイプの場合にしか見えません。私は "WithParameter"とそれが特定のクラスのためだけに働いているかどうかチェックします。私はそのautofac policityと思います。彼らは子供の依存関係に広がるためのパラメータを作ることができますが、 –

答えて

0

要求されたサービスを解決するときに、キーにのみ使用されます。キーがその後の解決操作に渡された場合、依存グラフのすべてのサービスも同じキーで登録される必要があります。

達成しようとしていることは、主クラスの依存関係を明示的にするラムダベースの登録を使用して行うことができます。

container.RegisterType<NamedA>().Named<INamed>("A");  
container.RegisterType<NamedB>().Named<INamed>("B"); 
container.Register(c => new MainClassOne(c.ResolveNamed<INamed>("A"))).Named<MainClassOne>("A"); 
container.Register(c => new MainClassTwo(c.ResolveNamed<INamed>("B"))).Named<MainClassTwo>("B"); 

これにより、正しい名前付き依存関係を確実に受け取るように、名前を使用してメインクラスを解決できます。

+0

伝播を規制するパラメータを持つことは良いでしょう。具体的にはLifeTimeScope内に設定して問題を解決しました。答えをありがとう –

関連する問題