多个链接的依赖项,其中一些需要 运行 个时间参数
Multiple Chained Dependencies, Some of Which Require Run Time Arguments
我正在使用 Castle Windsor 为 Web 服务项目设置依赖项注入。我有一些 classes 依赖于运行时参数,这些参数也是其他 classes 的依赖项。对于这个问题,我有一个可行的解决方案,但是随着运行时参数的依赖链变长,它变得混乱。我正在尝试实现一个更优雅的解决方案。
我用我注册的 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 的依赖项(这是我试图通过在此项目中实现依赖项注入来解决的原始问题)。此外,当我有一个 class 时,事情变得更加棘手,它具有在依赖链中向下几层的运行时依赖:
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);
}
我不确定这是否是该问题的最佳解决方案,但我能够使用 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>());
}
}
使用运行时间参数的实例将保留在范围内。
我没有将此标记为答案,因为我还不确定没有更好的解决方案
我正在使用 Castle Windsor 为 Web 服务项目设置依赖项注入。我有一些 classes 依赖于运行时参数,这些参数也是其他 classes 的依赖项。对于这个问题,我有一个可行的解决方案,但是随着运行时参数的依赖链变长,它变得混乱。我正在尝试实现一个更优雅的解决方案。
我用我注册的 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 的依赖项(这是我试图通过在此项目中实现依赖项注入来解决的原始问题)。此外,当我有一个 class 时,事情变得更加棘手,它具有在依赖链中向下几层的运行时依赖:
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);
}
我不确定这是否是该问题的最佳解决方案,但我能够使用 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>());
}
}
使用运行时间参数的实例将保留在范围内。 我没有将此标记为答案,因为我还不确定没有更好的解决方案