是否有可能从非单例组件注入实例方法委托
本文关键字:注入 实例方法 组件 单例 有可能 是否 | 更新日期: 2023-09-27 17:49:45
背景:给定接口、实现和消费者
public interface IDoer {
int DoIt(string arg);
}
public class LengthDoer : IDoer {
int _internalState;
public LengthDoer(IDependency dep) { _internalState = dep.GetInitialValue(); }
public int DoIt(string arg) {
_internalState++;
return arg.Length;
}
}
public class HighLevelFeature {
public HighLevelFeature(IDoer doer) { /* .. */ }
}
则可以直接配置Windsor,在施工时将Doer
注入HighLevelFeature
,而LengthDoer
具有PerWebRequest
的生活方式。
问题:然而,如果设计要更改为
public delegate int DoItFunc(string arg);
// class LengthDoer remains the same, without the IDoer inheritance declaration
public class HighLevelFeature {
public HighLevelFeature(DoItFunc doer) { /* .. */ }
}
那么是否有可能配置温莎注入LengthDoer.DoIt
作为一个实例方法委托,其中LengthDoer
有PerWebRequest
的生活方式,这样温莎可以跟踪和释放LengthDoer实例?换句话说,温莎会模仿:
// At the beginning of the request
{
_doer = Resolve<LengthDoer>();
return _hlf = new HighLevelFeature(doer.DoIt);
}
// At the end of the request
{
Release(_doer);
Release(_hlf);
}
DoItFunc
委托可以使用UsingFactoryMethod
:
container.Register(Component.For<IDoer>().ImplementedBy<LengthDoer>());
container.Register(Component.For<DoItFunc>()
.UsingFactoryMethod(kernel =>
{
return new DoItFunc(kernel.Resolve<IDoer>().DoIt);
}));