gpt4 book ai didi

c# - CaSTLe Windsor - 控制 transient 组件的创建

转载 作者:行者123 更新时间:2023-11-30 23:08:24 28 4
gpt4 key购买 nike

我是 CaSTLe Windsor 的新手,所以如果我在这里错过了一个明显的功能,请原谅我......

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

LoggerImpl.GetLogger("LoggerName");

当前具有 ILogger 依赖项(纯 DI)的每个组件在构造对象树时都会收到一个命名记录器,例如:

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")));

这一切似乎都可行,但我想知道是否有更简单的方法来做到这一点?这似乎是一大堆代码,随着越来越多的组件需要它们的记录器,这些代码会越来越多。

我想知道是否可以使用 Transient 生活方式通过 LoggerImpl 注册单个 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())

关于c# - CaSTLe Windsor - 控制 transient 组件的创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46565355/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com