Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Castle Windsor-控制瞬态组件的创建_C#_.net_Dependency Injection_Castle Windsor - Fatal编程技术网

C# Castle Windsor-控制瞬态组件的创建

C# Castle Windsor-控制瞬态组件的创建,c#,.net,dependency-injection,castle-windsor,C#,.net,Dependency Injection,Castle Windsor,我是温莎城堡的新手,所以如果我只是错过了一个明显的功能,请原谅我 我目前正在尝试将一个工作项目从纯DI切换到Castle。我有几个组件,它们具有ILogger类型的属性依赖关系。我的LoggerImpl是通过以下静态工厂方法创建的: LoggerImpl.GetLogger("LoggerName"); // register logger implementations container.Register(Component.For<ILogger>() .Implem

我是温莎城堡的新手,所以如果我只是错过了一个明显的功能,请原谅我

我目前正在尝试将一个工作项目从纯DI切换到Castle。我有几个组件,它们具有ILogger类型的属性依赖关系。我的LoggerImpl是通过以下静态工厂方法创建的:

LoggerImpl.GetLogger("LoggerName");
// 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")));
当前(纯DI)具有ILogger依赖关系的每个组件在构建对象树时都会收到一个命名记录器,例如:

var component1 = new MyComponent1(dependencies...);
component.Logger = LoggerImpl.GetLogger("Component1Logger");
var component2 = new MyComponent2(dependencies...);
component.Logger = LoggerImpl.GetLogger("Component2Logger");
切换到Castle Windsor后,我为引用它的每个组件注册了一个名为ILogger的单例,然后使用DependsOn(…)将这些记录器分配给我的组件。代码大致如下所示:

LoggerImpl.GetLogger("LoggerName");
// 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")));
//注册记录器实现
container.Register(Component.For())
.由()实施
.命名(“组件1日志”)
.UsingFactoryMethod(()=>LoggerImpl.GetLogger(“Component1Logger”));
container.Register(Component.For())
.由()实施
.命名(“组件2日志”)
.UsingFactoryMethod(()=>LoggerImpl.GetLogger(“Component2Logger”));
//注册组件实现
container.Register(Component.For())
.由()实施
.DependsOn(Dependency.OnComponent(typeof(ILogger),“Component1Logger”));
container.Register(Component.For())
.由()实施
.DependsOn(Dependency.OnComponent(typeof(ILogger),“Component2Logger”));
这一切似乎都是可行的,但我想知道是否有更简单的方法来做到这一点?这似乎是一个可怕的大量代码,随着越来越多的组件需要他们的记录器,这些代码将不断增长

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

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


如果您有任何意见、想法和建议,我们将不胜感激。

您可以使用子解析器

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())

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