Как сделать так, чтобы объекты единства вводили в тип, используя дочерний контейнер, когда клиентское приложение использует абстракцию IServiceLocator
Я пытаюсь использовать интерфейс CommonServiceLocator.IServiceLocator в качестве моей абстракции DI.
мой существующий код использует дочерние контейнеры, и я не могу найти способ исключить использование дочерних контейнеров во время выполнения, использование дочерних контейнеров заставляет клиента знать о единстве.
Что мне в основном нужно сделать, так это как-то сказать, что для некоторых регистраций он должен вводить параметры конструктора типов, используя дочерний контейнер.
Все регистрации выполняются с использованием файлов конфигурации времени разработки.
Есть ли способ сделать это с помощью файлов конфигурации?
Спасибо
[TestMethod]
public void Test()
{
//build configuration file for the test
ConfigurationBuilder defaultConfigurationBuilder = new ConfigurationBuilder();
defaultConfigurationBuilder.Add(typeof(IContract).FullName, typeof(Contract).FullName, "ContainerControlledLifetimeManager");
defaultConfigurationBuilder.Add(typeof(IComplexContract).FullName, typeof(ComplexContract).FullName, "ContainerControlledLifetimeManager");
defaultConfigurationBuilder.SaveAsDefault();
CommonServiceLocator.IServiceLocator loader = ServiceLoader.Load();
//should be resolved from main container
var contract = loader.GetInstance<IContract>();
//should be resolved from child container
var complextContract = loader.GetInstance<IComplexContract>();
//complextContract.Contract should be deferent from contract because complextContract.Contract should be injected using child container.
Assert.AreNotEqual(contract, complextContract.Contract);
}
public class ComplexContract : IComplexContract
{
public IContract Contract { get; set; }
public ComplexContract(IContract contract)
{
Contract = contract;
}
}
public interface IComplexContract
{
IContract Contract { get; set; }
}
Вот метод загрузки:
public static IServiceLocator Load(string defaultDiConfigfolder = "DefaultDIConfiguration", string overrideDiConfigfolder = "OverrideDIConfiguration")
{
UnityServiceLocator locator = new UnityServiceLocator(ConfigureUnityContainer(defaultDiConfigfolder, overrideDiConfigfolder));
ServiceLocator.SetLocatorProvider(() => locator);
return ServiceLocator.Current;
}
Спасибо