2012-04-22 1 views
9

を使用して依存関係プロパティを注入するために、私は次のクラスがあります。がどのようにIocをユニティ

public interface IServiceA 
{ 
    string MethodA1(); 
} 

public interface IServiceB 
{ 
    string MethodB1(); 
} 

public class ServiceA : IServiceA 
{ 
    public IServiceB serviceB; 

    public string MethodA1() 
    { 
     return "MethodA1() " +serviceB.MethodB1(); 
    } 
} 

public class ServiceB : IServiceB 
{ 
    public string MethodB1() 
    { 
     return "MethodB1() "; 
    } 
} 

私はIoCのためにUnityの使用は、私の登録は、次のようになります

container.RegisterType<IServiceA, ServiceA>(); 
container.RegisterType<IServiceB, ServiceB>(); 

私はServiceAインスタンスを解決し、 serviceBnullになります。 どうすれば解決できますか?

答えて

14

あなたがここに、少なくとも2つのオプションがあります。、あなたが/コンストラクタ・インジェクションを使用する必要がありますすることができ

をそのためにあなたは、コンストラクタが必要です。

public class ServiceA : IServiceA 
{ 
    private IServiceB serviceB; 

    public ServiceA(IServiceB serviceB) 
    { 
     this.serviceB = serviceB; 
    } 

    public string MethodA1() 
    { 
     return "MethodA1() " +serviceB.MethodB1(); 
    } 
} 

それともUnityは、プロパティインジェクションをサポートしていますが、そのためにあなたは、プロパティを必要としますそしてDependencyAttribute

public class ServiceA : IServiceA 
{ 
    [Dependency] 
    public IServiceB ServiceB { get; set; }; 

    public string MethodA1() 
    { 
     return "MethodA1() " +serviceB.MethodB1(); 
    } 
} 

MSDNサイトWhat Does Unity Do?はUnityのための良い出発点です。

+6

コンストラクタとプロパティインジェクションのどちらかを選択する場合は、コンストラクタインジェクションを選択する必要があります。プロパティインジェクションは、クラスを単一性に依存させるか、または他の呼び出し元がその依存関係を提供する必要があることを「覚えている」ことに依存します。コンストラクタインジェクションは、依存関係がクラスにとって不可欠であるクラスを使用しようとする人には明らかです。 – Carlos

+0

そして、クラスに複数の依存関係がある場合、それは特定の呼び出しでは必ずしも必要ではありませんか?それらはすべてインスタンス化されますか?あるいは、上記のようにアクセスされたときにのみインスタンス化されます:serviceB.method()? @Carlos – Legends

+1

@あなたのすべての方法でそれらを使用しなくても、ServiceAが作成されると、すべての依存関係が確立され注入されます。 Unityは遅延のないインスタンス化をサポートしていませんが、拡張子として追加することができます:http://pwlodek.blogspot.hu/2010/05/lazy-and-ienumer-support-comes-to.html – nemesv

関連する問題