2013-03-10 2 views
0

У меня есть следующие конфигурации:.Unity конфигурации работает в обратном направлении

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    <section name="unity1" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/> 
    <section name="unity2" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/> 
    </configSections> 
    <unity1 configSource="unity1.config" /> 
    <unity2 configSource="unity2.config" /> 
</configuration> 

и следующее в файле unity1 (unity2 одно и то же, но с 2 вместо 1 в очевидных местах

<?xml version="1.0" encoding="utf-8" ?> 
<unity1 xmlns="http://schemas.microsoft.com/practices/2010/unity"> 
    <alias alias="IInjectMe1" type="CommonLib.IInjectMe1, CommonLib"/> 
    <container name="unity1"> 
    <register type="IInjectMe1" name="Injected1" mapTo="CommonLib.InjectMe1, CommonLib" /> 
    </container> 
</unity1> 

у меня есть этот код в одном файле класса в сборке под названием CommonLib:

 public void StartUp() 
    { 
     var config1 = (UnityConfigurationSection)ConfigurationManager.GetSection("unity1"); 
     IUnityContainer container = new UnityContainer(); 
     config1.Configure(container, "unity1"); 

     var config2 = (UnityConfigurationSection)ConfigurationManager.GetSection("unity2"); 
     config2.Configure(container, "unity2"); 

     var test1 = container.Resolve<InjectMe1>(); // WHY NOT THE INTERFACE?? 

     var test2 = container.Resolve<InjectMe2>(); // WHY NOT THE INTERFACE?? 

     Console.WriteLine(test1 != null && test2 != null); 
    } 
} 

public class InjectMe1 : IInjectMe1 {} 

public interface IInjectMe1 {} 

public class InjectMe2 : IInjectMe2 {} 

public interface IInjectMe2 {} 

Мой вопрос, выше, где я поставил «ПОЧЕМУ НЕ ИНТЕРФЕЙС», почему мне нужно указывать конкретный класс вместо интерфейса? Я уверен, что уже поздно, и я не вижу дерева для деревьев, но я должен указать конкретный тип, и он создает правильный конкретный тип. Я хочу указать интерфейс и решить его.

Я хочу container.Resolve<IInjectMe1>() работать. Обратите внимание на интерфейс I.

Edit: Если я выше, я получаю ошибку:

Test method CommonLib.Tests.UnitTest1.TestMethod1 threw exception: Microsoft.Practices.Unity.ResolutionFailedException: Resolution of the dependency failed, type = "CommonLib.IInjectMe1", name = "(none)". Exception occurred while: while resolving. Exception is: InvalidOperationException - The current type, CommonLib.IInjectMe1, is an interface and cannot be constructed. Are you missing a type mapping?

+0

Вам не обязательно, вы можете указать интерфейс. Вы получаете ошибки с 'container.Resolve ()'? – Ramunas

+0

Да: var test1 = container.Resolve (); дает мне ошибку: разрешение проблемы не выполнено, type = "CommonLib.IInjectMe1", name = "(none)". – Ian

+0

Удалить имя = "injected1" из вашего xml config. –

ответ

1

Не имею компилятор под рукой, но я подозреваю, что вы должны удалить имя = «Injected1» из XML.

Создав именованную регистрацию, вы ограничиваете себя разрешенным именем. Но, видимо, вы разрешаете регистрацию по умолчанию.

+0

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

+0

Это действительно удобно. Именованные регистрации позволяют вам иметь условные регистрации, разрешенные по имени. –

+0

Да, я медленно получаю, как он построен. Там много власти, я надеюсь, что некоторые вещи перехвата работают хорошо. – Ian

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