2011-08-09 3 views
-2

У меня есть этот тип иерархии классов:параметры конструктора Unity, с закруткой

public interface IA{} 

public interface IB{void Foo();} 

public class A:IA 
{ 
[Dependency] 
IB myb{get;set;} 

void myfunc(){ myb.Foo()} 
} 

public class B:IB 
{ 
public B(IA ia){} 
} 

Я хочу, чтобы экземпляр класса А с Unity. Но когда я хочу сделать это, я хотел бы написать что-то вроде этого:

public Testclass 
{ 
void TestMethod() 
{ 
    IUnityContainer container = new UnityContainer(); 
    A currentA; 
    container.RegisterType<IB,B>(new InjectionConstructor(currentA); 
    currentA = container.Resolve<A>(); 
} 
} 

Это терпит неудачу на container.RegisterType линии, говоря, что «логический вывод Тип параметра не работает для нулевых значений.»

Как это сделать?

Редактировать: Ahhhh, как я ненавижу это ... Наш Архитектор сделал два интерфейса с одним и тем же именем, и именно поэтому я потратил 2 часа в моей жизни. Даниэль Хильгарт дал мне хорошую идею, но я не мог использовать ее, пока не понял, что resharper импортировал неправильный интерфейс.

+0

Пожалуйста, исправьте форматирование своего кода и сделайте его компилируемым! Код, который вы предоставили, является нечитаемым и недействительным. –

+0

, конечно, он не подлежит компиляции, это мета код. Я просто написал это, чтобы представить свою проблему. Это вполне читаемо на моем компьютере –

ответ

4

У вас есть круговая зависимость. Плохо. Либо исправьте это, либо создайте фабрику для создания A.

+0

Я знаю, что у меня круговая зависимость, но на самом деле, без единства, это легко сделать в конструкторе A: public A() {myb = new B (this)} –

+0

Это как раз простой на заводе: «A CreateA() {A a = новый A(); a.myb = новый B (a); return a;} ' –

+0

И где этот CreateA должен быть ?. A не может видеть B, поэтому Unity необходим. –

0

В Ninject вы можете отложить некоторые работы, выполнив свой класс IInitializable. Вы могли бы сделать что-то подобное здесь. В Initialize вы можете исправить любые зависимости, которые не были возможны во время фазы на основе конструктора.

Но, ваш вопрос не очень ясен. Вы задаете проблему, но не конкретный вопрос. «Почему это не работает?», «Если это сработает?», «Может ли кто-нибудь предложить альтернативу, стратегию?» И т. Д.?

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