是否有可能从非单例组件注入实例方法委托

本文关键字:注入 实例方法 组件 单例 有可能 是否 | 更新日期: 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作为一个实例方法委托,其中LengthDoerPerWebRequest的生活方式,这样温莎可以跟踪和释放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);
        }));