tik*_*noa 4 c# decorator simple-injector
通常,要使用构造函数注入注册一些配置值,我会这样做:
string setting = ConfigurationManager.AppSettings["SomeSetting"];
container.Register<IService>(new Service(setting));
Run Code Online (Sandbox Code Playgroud)
你如何完成类似的事情,以便将配置值传递给装饰器构造函数?
是创建一些可以注入装饰器的配置提供程序类的唯一方法吗?似乎 RegisterDecorator 应该有一个重载,允许根据需要手动更新类。
有几种方法可以实现这一点。如果对象图的那部分很简单,手动构建对象图可能会得到最好的结果:
container.RegisterSingleton<IService>(new ServiceDecorator(
setting,
new RealService()));
// or
container.Register<IService>(() => new ServiceDecorator(
setting,
new RealService()));
Run Code Online (Sandbox Code Playgroud)
RegisterDecoratorSimple Injector 中没有委托重载,这意味着您无法使用RegisterDecorator手动连接的装饰器注册装饰器,但有一些替代方法。
您可以将设置值提取到它自己的类中。这允许该抽象被注入到装饰器中:
container.RegisterSingleton<MySetting>(new MySetting(setting));
container.RegisterDecorator(typeof(IService), typeof(ServiceDecorator));
public ServiceDecorator : IService {
public ServiceDecorator(MySetting setting, IService decoratee) { }
}
Run Code Online (Sandbox Code Playgroud)
或者您可以将设置注入到装饰器的属性中:
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) { }
}
Run Code Online (Sandbox Code Playgroud)
或者您可以将Setting其设为静态属性:
ServiceDecorator.Setting = setting;
container.RegisterDecorator(typeof(IService), typeof(ServiceDecorator));
Run Code Online (Sandbox Code Playgroud)
如果装饰器本身无法更改,则可以从该类派生:
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));
Run Code Online (Sandbox Code Playgroud)
最后一个选项是覆盖参数注入行为,但这有点复杂,我通常只在集成场景中建议这样做。
| 归档时间: |
|
| 查看次数: |
266 次 |
| 最近记录: |