2009-09-02 17 views
3

私はUnity - InjectionPropertyはnullプロパティを返しますか?

container.RegisterType<IInterface, MyClass>(); 

すべての作品、および注釈付きで依存するすべてのプロパティ:

[Dependency] 

がコンテナによって解決されています。

しかし、今私はコンテナを通して解決したいintプロパティを持っています。それはコンストラクタではなく、公のプロパティとして渡されます。だから私はこれを試してみました:

container.RegisterType<IInterface, MyClass>(
    new InjectionProperty("PropertyName", 1) 
); 

は今、そのプロパティが注入されますが、[依存関係]で注釈を付け、他のすべてのプロパティがnullであり、解決されません。 1つのプロパティに対してInjectionPropertyを使用する場合、[Dependency]属性を持つ他のすべてのプロパティを明示的に宣言する必要がありますか?それとももっと良い方法がありますか?

ありがとうございました。

答えて

1

API(ランタイム)でプロパティを登録すると、[依存関係]属性が取り消されます。 両方を使用することはできません。しかし、リフレクションを使用して[Dependency]属性で装飾されたプロパティを取得し、実行時に登録することができます。

6

@najmeddineは正しいのですが、引き続き次のことができます。

あなたのコンポーネント:

public class Service : IService 
{ 
    [Dependency("Key")] 
    public Int32 Value { get; set; } 
} 

登録:

IUnityContainer unity = new UnityContainer() 
    .RegisterType<IService, Service>() 
    .RegisterInstance("Key", 2010) 

使い方は簡単です。

IUnityContainer child = unity.CreateChildContainer() 
    .RegisterInstance("Key", 1900); 

:あなたは今、ユニティを使用する場合は、アプリケーションのさまざまな分野で異なる値(有界コンテキスト)を注入する必要がある場合

は(あなたのために利用できなかった)と、2.0以上では、コンテナの階層を使用しますchildユニティコンテナでコンポーネントを解決してください。コンテナ階層について

より:najmeddineが言ったように http://msdn.microsoft.com/en-us/library/ff660895(PandP.20).aspx

0

InjectionProperty登録が[Dependency]属性をオーバーライドする...あなたは、しかし、まだ[Dependency]属性を上書きしないようにInjectionMethodオブジェクトを使用することができます。

私は、オプションの "上書き" する方法と私のオブジェクトを構築し、次のように通常のDIが働くだろう

class SomeObject 
{ 
    [Dependency("Value")] 
    public string Value { get; set; } 

    public void OverrideValue(string value) 
    { 
     this.Value = value; 
    } 
} 

container.RegisterInstance<string>("Value", "Default Value"); 

container.Resolve<SomeObject>(); 

をオーバーライドされた値を使用すると、以下の操作を行います。

container.RegisterType<SomeObject>("NotDefault", new InjectionMethod("OverrideValue", "Other Value")); 

container.Resolve<SomeObject>("NotDefault"); 

私はちょうど私の頭の上からこれを書いたので、私は事前にすべてのタイプミスをお詫び申し上げます。 (もしあなたが何かを見つけたら、ちょうどコメントと私は私の答えを調整することを嬉しく思うでしょう。)

関連する問題