Как сделать так, чтобы объекты единства вводили в тип, используя дочерний контейнер, когда клиентское приложение использует абстракцию 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;
    }

Спасибо

0 ответов

Другие вопросы по тегам