У меня есть следующие конфигурации:.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?
Вам не обязательно, вы можете указать интерфейс. Вы получаете ошибки с 'container.Resolve()'? –
Ramunas
Да: var test1 = container.Resolve(); дает мне ошибку: разрешение проблемы не выполнено, type = "CommonLib.IInjectMe1", name = "(none)". –
Ian
Удалить имя = "injected1" из вашего xml config. –