温莎城堡的多个组件用于给定服务
Windsor Castle multiple components for a given service
我有一个 ILog 接口和 2 个可能的实现:一个控制台日志和一个文件日志。我在 MVC 应用程序中使用温莎城堡,因此我在控制器安装程序中有以下代码:
container.Register(
Component.For<ILogFactory>().ImplementedBy<LogFactory>().Named("first").OnCreate(x => x.initialize(LogType.Console, null)).LifestyleSingleton(),
Component.For<ILogFactory>().ImplementedBy<LogFactory>().Named("second").OnCreate(x => x.initialize(LogType.File, null)).LifestyleSingleton(),
Component.For<ILog>().UsingFactoryMethod(kernel => kernel.Resolve<ILogFactory>("first").GetLog(LogType.Console)).Named("first_log").LifestyleSingleton(),
Component.For<ILog>().UsingFactoryMethod(kernel => kernel.Resolve<ILogFactory>("second").GetLog(LogType.File)).Named("second_log").LifestyleSingleton()
);
在我的 TestController 中,我有以下代码:
private ILog log;
public TestController(ILog _log)
{
log = _log;
}
我想知道如何决定注入名为 first_log 或 second_log
的 ILog
抱歉回复晚了。
您可以使用子依赖解析器。它允许您解决特定组件对另一个组件的依赖关系。下面的代码应该(未测试)根据 TestController 的构造函数中的参数名称解析 ILog。
所以TestController(ILog first)会先解析命名为first的ILog。
class SubDepResolver : ISubDependencyResolver
{
private IKernel kernel;
SubDepResolver(IKernel kernel)
{
this.kernel = kernel;
}
public bool CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model,
DependencyModel dependency)
{
if (model.GetComponentType() != typeof(TestController)) return false;
if (dependency.GetComponentType() != typeof(ILog)) return false;
return true;
}
public object Resolve(
CreationContext context,
ISubDependencyResolver contextHandlerResolver,
ComponentModel model,
DependencyModel dependency)
{
var handlers = kernel.GetHandlers(typeof(ILog));
var handler = handlers.Single(h => h.GetComponentName() == dependency.DependencyKey);
return handler.Resolve(context);
}
}
添加解析器使用:
container.Kernel.Resolver.AddSubResolver(new SubDepResolver(container.Kernel));
祝你好运,
马尔维恩.
我找到了适合我的场景的解决方案。 TestController 需要定义 2 个 ILog:
public class TestController : Controller
{
private ILog log1;
private ILog log2;
public TestController(ILog _log1, ILog _log2)
{
log1 = _log1;
log2 = _log2;
identifier = _identifier;
}
那么需要补充的是:
container.Register(
Component.For<MyController>().DependsOn(
ServiceOverride.ForKey("_log1").Eq("first_log"),
ServiceOverride.ForKey("_log2").Eq("second_log")).LifestyleTransient()
);
替换实际的默认内容:
container.Register(
Classes.
FromThisAssembly().
BasedOn<IController>().
If(c => c.Name.EndsWith("Controller")).
LifestyleTransient());
我有一个 ILog 接口和 2 个可能的实现:一个控制台日志和一个文件日志。我在 MVC 应用程序中使用温莎城堡,因此我在控制器安装程序中有以下代码:
container.Register(
Component.For<ILogFactory>().ImplementedBy<LogFactory>().Named("first").OnCreate(x => x.initialize(LogType.Console, null)).LifestyleSingleton(),
Component.For<ILogFactory>().ImplementedBy<LogFactory>().Named("second").OnCreate(x => x.initialize(LogType.File, null)).LifestyleSingleton(),
Component.For<ILog>().UsingFactoryMethod(kernel => kernel.Resolve<ILogFactory>("first").GetLog(LogType.Console)).Named("first_log").LifestyleSingleton(),
Component.For<ILog>().UsingFactoryMethod(kernel => kernel.Resolve<ILogFactory>("second").GetLog(LogType.File)).Named("second_log").LifestyleSingleton()
);
在我的 TestController 中,我有以下代码:
private ILog log;
public TestController(ILog _log)
{
log = _log;
}
我想知道如何决定注入名为 first_log 或 second_log
的 ILog抱歉回复晚了。
您可以使用子依赖解析器。它允许您解决特定组件对另一个组件的依赖关系。下面的代码应该(未测试)根据 TestController 的构造函数中的参数名称解析 ILog。 所以TestController(ILog first)会先解析命名为first的ILog。
class SubDepResolver : ISubDependencyResolver
{
private IKernel kernel;
SubDepResolver(IKernel kernel)
{
this.kernel = kernel;
}
public bool CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model,
DependencyModel dependency)
{
if (model.GetComponentType() != typeof(TestController)) return false;
if (dependency.GetComponentType() != typeof(ILog)) return false;
return true;
}
public object Resolve(
CreationContext context,
ISubDependencyResolver contextHandlerResolver,
ComponentModel model,
DependencyModel dependency)
{
var handlers = kernel.GetHandlers(typeof(ILog));
var handler = handlers.Single(h => h.GetComponentName() == dependency.DependencyKey);
return handler.Resolve(context);
}
}
添加解析器使用:
container.Kernel.Resolver.AddSubResolver(new SubDepResolver(container.Kernel));
祝你好运, 马尔维恩.
我找到了适合我的场景的解决方案。 TestController 需要定义 2 个 ILog:
public class TestController : Controller
{
private ILog log1;
private ILog log2;
public TestController(ILog _log1, ILog _log2)
{
log1 = _log1;
log2 = _log2;
identifier = _identifier;
}
那么需要补充的是:
container.Register(
Component.For<MyController>().DependsOn(
ServiceOverride.ForKey("_log1").Eq("first_log"),
ServiceOverride.ForKey("_log2").Eq("second_log")).LifestyleTransient()
);
替换实际的默认内容:
container.Register(
Classes.
FromThisAssembly().
BasedOn<IController>().
If(c => c.Name.EndsWith("Controller")).
LifestyleTransient());