4

У меня есть два класса, один из которых устанавливает контейнер, регистрируя типы и тот, который содержит статическое свойство, которое я хочу ввести. Моя проблема заключается в том, что свойство никогда не устанавливается путем инъекции, поэтому, когда я вызываю метод на нем, свойство всегда равно нулю.Unity Static Property Injection

public class ClassOne 
{ 
    public void Method() 
    { 
     Container.RegisterType<IClass, ClassImplOne>("ImplOne"); 
     Container.RegisterType<IClass, ClassImplTwo>("ImplTwo"); 
    } 
} 

public static class ClassTwo 
{ 
    [Dependency] 
    public static IClass SomeProperty { get; set; } 

    public static void SomeOtherMethod() 
    { 
     SomeProperty.AnotherMethod(); 
    } 
} 

Если удалить атрибут зависимостей и в ClassOne сделать простой

ClassTwo.SomeProperty = Container.Resolve<IClass>("ImplOne"); 

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

Редактировать:

Thanks. Я удалил статическую декларацию от ClassTwo и ClassOne добавил RegisterType и Resolve для ClassTwo, а также добавил InjectionProperty:

Container.RegisterType<IClass, ClassImplOne>("ImplOne", new InjectionProperty("SomeProperty")); 

, но он по-прежнему не работает: S

+0

Отредактированный мой ответ, чтобы быть более точным. – jlvaquero

ответ

5

Unity инъекционных зависимости, когда класс будет решен с помощью Единство. Статический класс не может быть создан, поэтому Unity не может вводить зависимости.

Вместо того, чтобы иметь класс Static, используйте Unity для разрешения псевдо-одиночного класса (ContainerControlledLifetimeManager) ClassTwo. Таким образом Unity вводит IClass в ClassTwo, когда создается ClassTwo (разрешенный контейнер единства) и, как настроен как singleton, вы всегда имеете тот же самый уровень ClassTwo во всей жизненной программе вашего приложения.

Вы должны решить ClassTwo через Unity.

Container.RegisterType<IClass, ClassImplOne>("ImplOne"); 
Container.RegisterType<IClass, ClassImplTwo>("ImplTwo"); 
Container.RegisterType<InterfaceImplemetedByClassTwo, ClassTwo>(); 

//Simple example. Don't forget to use ContainerControlledLifetimeManager for ClassTwo to simulate sigleton. 

И когда вам нужно ClassTwo:

Container.Resolve<InterfaceImplemetedByClassTwo> 

Возникли конфиг в ClassTwo:

public class ClassTwo : InterfaceImplemetedByClassTwo 
{ 
    [Dependency("ImplOne")] //inject ClassImplOne 
    public IClass SomeProperty { get; set; } 

НО это не большое решение, я думаю, ваша проблема с ФИЛОСОФИЯ диатомовый Вам нужно каскадировать зависимости от классов верхнего уровня вашего приложения. Разрешите классы верхнего уровня явным образом. (Container.Resolve) и зависит от каскада инжекции, благодаря магии Unity. Когда 2 класса (верхний слой или нет) должны использовать один и тот же экземпляр ClassTwo Unity выполняют грязную работу, если вы сконфигурировали ClassTwo с ContainerControlledLifetimeManager.

Другими словами, вам не нужен статический класс, вы вводите один и тот же экземпляр класса в другие классы, чем это необходимо.

+0

Спасибо. Я отредактировал вопрос с комментариями – clicky

+0

Спасибо, я воспроизвел то, что вы сказали, и он все еще не работает. ClassTwo был статичным только потому, что все составляющие являются статическими, поскольку они привязаны к Excel и Office Ribbon через ExcelDNA и XML. Я удалил статическое ключевое слово из класса, зарегистрированного ClassTwo и разрешило его после регистрации ClassImplOne, но свойство по-прежнему равно null. – clicky

+0

Unity будет только вводить свойства экземпляра - вам также нужно взять статическую информацию о свойствах. –

5

Отредактировано после рассмотрения комментариев:

Есть множество причин, почему иногда вы все еще хотите или должны использовать статические классы вместо каскадных все через Unity.

Если статический класс имеет зависимость от другого класса, который вы хотите настроить или сменить через конфигурацию Unity, я предпочитаю использовать фабричный шаблон, как описано в How to resolve dependency in static class with Unity?, или просто назначить функцию для решения проблемы, когда это необходимо, чем ссылаться на контейнер из статического класса. Одно из преимуществ заключается в том, что вся ваша конфигурация Unity может находиться в одном месте.

В вашем случае это может выглядеть следующим образом:

public static class ClassTwo 
{ 
    private static IClass _someProperty; 

    public static Func<IClass> ResolveProperty { private get; set; } 

    private static IClass SomeProperty 
    { 
     get { return _someProperty ?? (_someProperty = ResolveProperty()); } 
    } 

    public static void SomeOtherMethod() 
    { 
     SomeProperty.AnotherMethod(); 
    } 

} 

И в конфигурации Unity добавить следующее:

ClassTwo.ResolveProperty =() => container.Resolve<IClass>(); 

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

  • Нет связанных вопросов^_^