2009-09-02 3 views
3

Когда яUnity - InjectionProperty возвращает нулевые свойства?

container.RegisterType<IInterface, MyClass>(); 

все работает, и все зависимые свойства с аннотацией:

[Dependency] 

разрешаются через контейнер.

Но у меня теперь есть свойство int, которое я хотел бы также разрешить через контейнер. Он не передается в конструкторе, а как публичное свойство. Так что я попытался это:

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

Теперь, когда свойство получает инъекцию, но все остальные свойства аннотированных с [Dependency] являются недействительными и не решено. Если я использую InjectionProperty для одного свойства, теперь мне нужно явно объявить все другие свойства, которые имеют атрибут [Dependency]? Или есть лучший способ сделать это?

Спасибо.

ответ

1

Регистрация свойств с помощью API (runtime) отменяет атрибуты [Dependency]. Вы не можете использовать оба варианта. Но вы можете использовать отражение, чтобы получить свойства, украшенные атрибутом [Dependency] и зарегистрировать их во время выполнения.

6

Хотя @najmeddine верен, вы все равно можете сделать следующее.

Ваш компонент:

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

Регистрация:

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

Использование проста.

Если теперь использовать Unity 2.0 или выше (который не был доступен для вас), и если вам нужно вводить различные значения в различных областях (ограниченные контексты) ваше приложение, используйте контейнер иерархии:

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

И разрешите ваши компоненты на child Unity Container.

Подробнее о контейнерных иерархиях: http://msdn.microsoft.com/en-us/library/ff660895(PandP.20).aspx

0

Как najmeddine сказал, что InjectionProperty регистрации отменяют [Dependency] атрибутов ... Вы можете, однако, по-прежнему использовать InjectionMethod объекты не отменяют [Dependency] атрибутов.

Я построил свои объекты с дополнительной "Override" методой:

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

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

Normal DI будет работать следующим образом:

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

container.Resolve<SomeObject>(); 

С перегруженным значением, вы должны сделать следующее:

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

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

Я только что написал это с головы, поэтому извиняюсь за любые опечатки заранее. (Если вы найдете какие-либо комментарии, и я с удовольствием отредактирую свой ответ.)

Смежные вопросы