3

我有MVC webApi适用于Unity. 我必须将接口解析ITest为单例类(DelegateHandler)。但是接口 ITest 具有每个httprequest生命周期管理器,这很重要。所以我无法解决Application_Start事件上的 ITest,因为现在没有 HttpRequest 但 DelegateHandler 只会在 httprequest 生命周期中使用 ITest。

那么是否可以向 DelegateHandler 发送惰性解析,或者可能有人有其他有趣的解决方案?

4

2 回答 2

2

服务的生命周期应始终等于或短于其依赖项的生命周期,因此您通常会注册ITest为 Per Http Request 或 Transient,但如果这不可能,请将DelegateHandler具有每个 Http Request 生命周期的依赖项(我假设)包装在代理:

// Proxy
public class DelegateHandlerProxy : IDelegateHandler
{
    public Container Container { get; set; }

    // IDelegateHandler implementation
    void IDelegateHandler.Handle()
    {
        // Forward to the real thing by resolving it on each call.
        this.Container.Resolve<RealDelegateHandler>().Handle();
    }
}

// Registration
container.Register<IDelegateHandler>(new InjectionFactory(
    c => new DelegateHandlerProxy { Container = c }));
于 2012-04-05T09:49:54.400 回答
0

另一种选择是执行以下操作:

public class Foo
{
    Func<IEnumerable<ITest>> _resolutionFunc;
    ITest _test;
    public Foo(Func<IEnumerable<ITest>> resolutionFunc)
    {
        _resolutionFunc=resolutionFunc;
    }

private void ResolveFuncToInstance()
{
    _test=_resolutionFunc().First();
}
}

我们正在做的是要求 Unity 为我们提供一个委托,该委托将解析容器中的所有 ITest 实例。由于这是一个 Func,我们可以在想要从 Unity 进行实际解析时调用它。

这与 Steven 所做的事情大致相同,但使用内置的 Unity 功能来完成我们正在寻找的事情。

于 2012-11-15T15:41:26.040 回答