Несколько зависимостей, некоторые из которых требуют аргументов времени выполнения - PullRequest
0 голосов
/ 17 октября 2019

Я устанавливаю внедрение зависимостей для проекта веб-службы с помощью Castle Windsor. У меня есть некоторые классы, которые зависят от аргументов времени выполнения, которые также являются зависимостями для других классов. У меня есть несколько работающее решение этой проблемы, но оно становится грязным, так как цепочка зависимостей становится длиннее с аргументами времени выполнения. Я пытаюсь реализовать более элегантное решение.

У меня есть некоторые из этих зависимостей, разрешенных с помощью TypedFactoryFacility, которые я регистрирую так:

public interface ISomeClassFactory
{
   ISomeClass Create(ISomeSimpleDependency dependency);
}

...

public interface ISomeSimpleDependencyFactory
{
   ISomeSimpleDependency Create(string runtimeArgument);
}

...

public void Install(IWindsorContainer container, IConfigurationStore store)
{
    container.Register(
        Component.For<ISomeClass>().ImplementedBy<SomeClass>(),
        Component.For<ISomeClassFactory().AsFactory());
    container.Register(
        Component.For<ISomeSimpleDepencency>().ImplementedBy<SomeSimpleDependency>(),
        Component.For<ISomeSimpleDepencencyFactory().AsFactory());
}

И называется так:

public void WebServiceMethod(string runtimeArgument)
{
    ISomeSimpleDependency someSimpleDependency = container.Resolve<ISomeSimpleDependencyFactory>().Create(runtimeArgument);
    ISomeClass someClass = container.Resolve<ISomeSimpleClassFactory>().Create(someSimpleDependency);
    // the rest of the method
}

Thgis работает, но с этим есть некоторые проблемы. Даже если мне не нужно вызывать какие-либо методы для someSimpleDependency, я должен создать его экземпляр, чтобы он стал зависимостью для someClass (это первоначальная проблема, которую я пытался решить путем внедрения внедрения зависимостей в этом проекте). Более того, все становится сложнее, когда у меня есть класс с зависимостью во время выполнения, которая находится на несколько уровней ниже в цепочке зависимостей:

ISomeClass -> IDependency1 -> IDependency2 -> IDependency3 -> runtimeArgument

Есть ли способ создания экземпляра someClass без использования фабричных методов, связанных изЗависимость 3?

public void WebServiceMethod(string runtimeArgument)
{
    IDependency3 dependency3= container.Resolve<IDependency3Factory>().Create(runtimeArgument);
    IDependency2 dependency2 = container.Resolve<IDependency2Factory>().Create(dependency3);
    IDependency1 dependency1 = container.Resolve<IDependency1Factory>().Create(dependency2);

    ISomeClass someClass = container.Resolve<ISomeClassFactory>().Create(dependency1);

}

1 Ответ

0 голосов
/ 17 октября 2019

Я не уверен, что это лучшее решение этой проблемы, но мне удалось получить рабочее решение, используя Scoped Lifestyle .

public void Install(IWindsorContainer container, IConfigurationStore store)
{
    container.Register(Component.For<ISomeClass>().ImplementedBy<SomeClass>());
    container.Register(Component.For<IDependency1>().ImplementedBy<Dependency1>());
    container.Register(
        Component.For<ISomeSimpleDepencency>().ImplementedBy<ISomeSimpleDepencency>().LifeStyleScoped(),
        Component.For<ISomeSimpleDepencencyFactory().AsFactory());
}

И в вызывающем методе

public void WebServiceMethod(string runtimeArgument)
{
    using (container.BeginScope())
    {
        IDependency3 dependency3= container.Resolve<ISomeSimpleDepencencyFactory>().Create(runtimeArgument);

        ISomeClass someClass = container.Resolve<ISomeClass>());
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...