2

誰かが問題を解決するのを手伝ってくれませんか。

2 つのコンストラクターと依存関係を持つクラス SeviceImpl のインスタンスを追加しようとしています。

以下は私が得るものです。

  • バリアント A では、ユニティは依存関係を注入しません。そうなると思いました。
  • バリアント BI では、オブジェクトが既に存在するときに BuildUp() メソッドがコンストラクターをチェックする必要がある理由がわかりませんか? 依存関係を注入できないのはなぜですか?

    public interface IService
    {
        void Run();
    }
    
    public class Database
    {
    }
    
    public class ServiceImpl : IService
    {
        public ServiceImpl(int i)
        {}
    
        public ServiceImpl(bool b)
        { }
    
        [Dependency]
        public Database Db { get; set; }
    
        public void Run()
        {}
    }
    
     public static void Main()
     {
            using (var unity = new UnityContainer())
            {
                unity.RegisterInstance<Database>(new Database());
    
                // Now I want to register an instance of ServiceImpl
    
                // Variant A
    
                unity.RegisterInstance<IService>(new ServiceImpl(3));
                var srv = unity.Resolve<IService>();
                // srv.Db is null which is bad
                unity.BuildUp(srv); // Doesn't throw an exception
                // srv.Db is still null
    
                // Variant B
    
                var srv = new ServiceImpl(3);
                // Hoping this call will inject Database
                unity.BuildUp(srv); // Now it does: InvalidOperationException - The type ServiceImpl has multiple constructors of length 1. Unable to disambiguate.
                unity.RegisterInstance<IService>(srv);
            }
     }
    
4

2 に答える 2

1

バリアント A では、既存のインスタンスを登録しているため、コンテナーは追加の依存関係を注入しようとしません。

バリアント B では、コンテナーはデリゲートを作成してインスタンスを作成し、依存関係を注入します。このデリゲートは、新しいインスタンスの作成と新しいインスタンスへの依存関係の注入の両方に使用されるため、コンテナーがインスタンスの作成方法を理解できない場合、コンテナーは失敗します。インスタンスの作成に使用されているが、デリゲートの作成に失敗するのではなくビルドアップを許可する場合、コンテナーはデリゲートをスローするように設定する必要があると主張することもできますが、現在はそのように機能しています。

特定のコンストラクターを使用してインスタンスを作成する型を登録することでこれを回避できますが、コンテナーでこの型の新しいインスタンスを作成せず、既存のインスタンスを構築するだけである場合、これは適切ではない可能性があります。

unity.RegisterType<ServiceImpl>(new InjectionConstructor(false));
于 2012-10-26T12:58:12.373 に答える