使用DI框架有条件地处理对象(Ninject)

时间:2012-03-01 10:42:18

标签: asp.net-mvc-3 dependency-injection ninject ninject-2 ninject.web.mvc

我有以下代码

public class MyService : IMyService
{
    private readonoly IUnitOfWork _unitOfWork;
    public MyService(IUnitOfWork unitOfWork)
    {
        _unitOfWork = unitOfWork;
    }
}

//This code is used by web client
private static void RegisterServices(IKernel kernel) 
{
    kernel.Bind<IMyService>().To<MyService>();
    kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
}

我有一个web和Windows服务客户端都使用“MyService”类。如果客户端是Web,我想在HTTP请求结束时处理“工作单元”,就好像客户端是Windows服务一样,我想在每次数据库调用之后处理工作单元。怎么实现呢?我可以向MyService构造函数添加一个额外的标志,以识别客户端,但是在将具体类型映射到接口时,如何修改上面的代码以将硬编码值传递给该参数?

1 个答案:

答案 0 :(得分:0)

您的Windows服务中可能会有某种MyServiceRunner来调用您的MyService。此类是特定于Windows服务的,这将是显式控制IUnitOfWork生命周期的地方。或者你可以为MyService编写一个控制工作单元的装饰器。

有几点需要注意。虽然您可以基于每个Web请求重用IUnitOfWork,但请勿在Web请求结束时Commit工作单元,但在服务(成功)执行后明确执行此操作。由于IUnitOfWork的范围在Windows服务中非常不同,因此您可能需要一些显式代码或显式注册来处理此问题。但是,请确保您的MyService对此无动于衷:它不需要关心。

如果您要在Windows服务中调用许多服务,则可能需要考虑应用命令/处理程序模式来处理业务逻辑。您可以阅读更多相关信息here