2016-12-28 2 views
0
public interface IFoo {} 

public interface IBar {} 

public class Foo1 : IFoo {} 

public class FooOne : IFoo {} 
public class FooTwo : IFoo {} 

public class BarOne : IBar 
{ 
    public BarOne(IFoo foo) {}   
} 

public class BarTwo : IBar 
{ 
    public BarTwo(IFoo foo) {}   
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     UnityContainer container = new UnityContainer(); 
     container.RegisterType<IFoo, FooOne>("One") 
      .RegisterType<IFoo, FooTwo>("Two") 
      .RegisterType<IBar, BarOne>("One") 
      .RegisterType<IFoo, BarTwo>("Two");     

     string fooType = "One"; 
     string barType = "Two"; 

     IFoo myFoo = container.Resolve<IFoo>(fooType); 
     IBar myBar = container.Resolve<IBar>(barType); 
    } 
} 

Пример кода выше выдает эту ошибку:Как разрешить зависимость, используя именованный тип регистрации в Unity?

Постановление зависимости не удалось, тип = , название "ConsoleApplication5.IBar" = "Two". Исключение произошло во время: при разрешении. Исключение: InvalidOperationException. Текущий тип , ConsoleApplication5.IFoo, является интерфейсом и не может быть сконфигурирован как . Вам не хватает картографирования типов? ----------------------------------------------- На время, за исключением, контейнер был:

Разрешение ConsoleApplication5.BarTwo, Два (отображенный из ConsoleApplication5.IBar, два) Разрешение параметра "Foo" из конструктора ConsoleApplication5.BarTwo (ConsoleApplication5.IFoo Foo) Решение ConsoleApplication5. IFoo, (нет)

Мое решение использует DependencyResolver, который изменяет эту строку:

IBar myBar = container.Resolve<IBar>(barType); 

к этому:

IBar myBar = container.Resolve<IBar>(barType, new DependencyOverride<IFoo>(myFoo)); 

Я хочу, чтобы решить эту проблему, используя метод RegisterType. Возможно ли это или есть другое решение?

Спасибо.

+0

Некоторые детали отсутствуют. Вам необходимо зарегистрировать IMessageType с контейнером где-нибудь в вашем коде. – Tilak

+0

@ Тилак Я редактирую сообщение. Сообщение об ошибке принадлежало исходному коду. Теперь вы можете увидеть сообщение об ошибке упрощенной версии. –

ответ

1

Вы должны определить, какой из ваших IFoo с именем единиц регистрации должен использовать, когда вы решаете IBar.

container.RegisterType<IFoo, FooOne>("One") 
     .RegisterType<IFoo, FooTwo>("Two") 
     .RegisterType<IBar, BarOne>("One", new InjectionConstructor(
            new ResolvedParameter<IFoo>("One"))) 
     .RegisterType<IBar, BarTwo>("Two", new InjectionConstructor(
            new ResolvedParameter<IFoo>("Two"))); 

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

+0

Вы правы, но в этом примере он ранее разрешает IFoo с именованной регистрацией «Один». Я хочу заставить Unity продолжать использовать ту же регистрацию, когда это необходимо для разрешения IFoo. Разве это не возможно, или я пропустил какой-то момент? –

+0

IFoo «Один» разрешен, потому что он не имеет зависимости в конструкторе. поэтому Unity не имеет проблемы для его устранения. Проблема заключалась в регистрации вашего IBar. Я не понимаю, что вы подразумеваете под «использованием той же регистрации». В вашем примере, когда вы разрешаете IFoo по имени, проблем нет, но IBar зарегистрирован дважды и имеет зависимость от IFoo, которая также зарегистрирована дважды. Вы должны сказать Unity о регистрации, которую зарегистрировал IFoo, который он должен использовать. – Mark

+0

@Mehmet Kemal Bayer, если вы хотите разрешить всегда тот же «IFoo», почему вам нужна регистрация с именем? – Johnny

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