gpt4 book ai didi

c# - 如何注册手动创建的装饰器实例

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

通常,要使用构造函数注入(inject)注册一些配置值,我会这样做:

string setting = ConfigurationManager.AppSettings["SomeSetting"];
container.Register<IService>(new Service(setting));

为了将配置值传递给装饰器构造函数,您如何完成类似的事情?

是创建一些可以注入(inject)装饰器的配置提供程序类的唯一方法吗?似乎 RegisterDecorator 应该有一个重载,允许根据需要手动更新类。

最佳答案

有几种方法可以实现这一点。如果对象图的那部分很简单,手动构建对象图可能会得到最好的结果:

container.RegisterSingleton<IService>(new ServiceDecorator(
setting,
new RealService()));

// or
container.Register<IService>(() => new ServiceDecorator(
setting,
new RealService()));

Simple Injector 中没有 RegisterDecorator 的委托(delegate)重载,这意味着您不能使用手动连接的 RegisterDecorator 注册装饰器,但是有一些替代方法方法。

您可以将设置值提取到它自己的类中。这允许将抽象注入(inject)到装饰器中:

container.RegisterSingleton<MySetting>(new MySetting(setting));
container.RegisterDecorator(typeof(IService), typeof(ServiceDecorator));

public ServiceDecorator : IService {
public ServiceDecorator(MySetting setting, IService decoratee) { }
}

或者您可以将设置注入(inject)到装饰器的属性中:

container.RegisterDecorator(typeof(IService), typeof(ServiceDecorator));
container.RegisterInitializer<ServiceDecorator>(dec => dec.Setting = setting);

public ServiceDecorator : IService {
public string Setting { get; set; }
public ServiceDecorator(IService decoratee) { }
}

或者您可以将 Setting 设置为静态属性:

ServiceDecorator.Setting = setting;
container.RegisterDecorator(typeof(IService), typeof(ServiceDecorator));

如果装饰器本身不能改变,你可以从那个类派生:

public ServiceDecoratorWithSetting : ServiceDecorator {
public static string Setting { get; set; }
public ServiceDecorator(IService decoratee) : base(Setting, decoratee) { }
}

ServiceDecoratorWithSetting.Setting = setting;
container.RegisterDecorator(typeof(IService), typeof(ServiceDecoratorWithSetting));

最后一个选项是 override parameter injection behavior ,但这有点复杂,我通常只在集成场景中建议这样做。

关于c# - 如何注册手动创建的装饰器实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34281702/

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