有幾種方法可以實現這一點。如果對象圖的那部分很簡單,手工打造的對象圖可能會提供最好的結果:
container.RegisterSingleton<IService>(new ServiceDecorator(
setting,
new RealService()));
// or
container.Register<IService>(() => new ServiceDecorator(
setting,
new RealService()));
中有簡單的噴油器RegisterDecorator
沒有委託過載,這意味着你不能註冊一個裝飾使用RegisterDecorator
這是手動,但有一些替代方法。
您可以將設置值提取到它自己的類中。這使得該抽象得到注入到裝飾:
container.RegisterSingleton<MySetting>(new MySetting(setting));
container.RegisterDecorator(typeof(IService), typeof(ServiceDecorator));
public ServiceDecorator : IService {
public ServiceDecorator(MySetting setting, IService decoratee) { }
}
或者,你可以注入設置到裝飾的屬性:
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,但這有點複雜,我通常只會在集成方案中提出建議。