2017-10-04 48 views
2

我是新来的温莎城堡,所以请原谅我,如果我只是错过了这里一个明显的功能...城堡温莎 - 控制创造暂态分量的

我目前正在从单纯DI城堡切换工作项目。我有几个组件,它们具有ILogger类型的属性依赖项。我的LoggerImpl经由静态工厂方法创建这样的:

LoggerImpl.GetLogger("LoggerName"); 

构造对象树时,其具有ILogger依赖目前每个组件(纯DI)接收指定logger例如:

var component1 = new MyComponent1(dependencies...); 
component.Logger = LoggerImpl.GetLogger("Component1Logger"); 
var component2 = new MyComponent2(dependencies...); 
component.Logger = LoggerImpl.GetLogger("Component2Logger"); 

切换到Castle Windsor后,我为每个引用它的组件注册了一个名为ILogger的单例,然后使用DependsOn(...)将这些记录器分配给我的组件。代码或多或少是这样的:

// register logger implementations 
container.Register(Component.For<ILogger>() 
    .ImplementedBy<RolexLogger>() 
    .Named("Component1Logger") 
    .UsingFactoryMethod(() => LoggerImpl.GetLogger("Component1Logger")); 
container.Register(Component.For<ILogger>() 
    .ImplementedBy<RolexLogger>() 
    .Named("Component2Logger") 
    .UsingFactoryMethod(() => LoggerImpl.GetLogger("Component2Logger")); 

// register component implementations 
container.Register(Component.For<IComponent1>() 
    .ImplementedBy<MyComponent1>() 
    .DependsOn(Dependency.OnComponent(typeof(ILogger), "Component1Logger"))); 
container.Register(Component.For<IComponent2>() 
    .ImplementedBy<MyComponent2>() 
    .DependsOn(Dependency.OnComponent(typeof(ILogger), "Component2Logger"))); 

这一切似乎工作,但我想知道是否有一个更简单的方法来做到这一点?这看起来好像很多代码,随着更多的组件需要它们的记录器,这些代码将会增长和增长。

我想知道是否有可能通过LoggerImpl和Transient lifestyle注册一个ILogger的实现,然后以某种方式控制LoggerImpl的实例在每次依赖于ILogger得到解决时如何创建?

我假设我也可以在注册组件时使用Dependency.OnValue(LoggerImpl.GetLogger(“LoggerName”)),但是然后LoggerImpl实例不会在容器中注册,并且我不知道这是否可行。

任何意见,想法和建议将不胜感激。

回答

1

您可以使用subresolver

public class LoggerResolver : ISubDependencyResolver 
{ 
    public bool CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency) 
    { 
     return dependency.TargetType == typeof(ILogger); 
    } 

    public object Resolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency) 
    { 
     return LoggerImpl.GetLogger(model.Implementation.FullName); 
    } 
} 

比其添加到内核之前,您的任何注册的

container.Kernel.Resolver.AddSubResolver(new LoggerResolver()) 
+0

这正是我需要的,谢谢:)所以这实际上是一个功能,我不知道。顺便说一句,只是为了让代码有效 - 你能否在Resolve方法中删除“new”关键字? –

+0

啊确定一些错误。谢谢 –