使用DI框架(Ninject)对对象进行条件处理



我有以下代码

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构造函数中添加一个额外的标志来标识客户端吗?但是,在将具体类型映射到接口时,如何修改上面的代码以将硬编码值传递给该参数?

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

有几点需要注意。尽管您可以在每个web请求的基础上重用IUnitOfWork,但不要在web请求结束时重用Commit工作单元,而是在服务(成功)执行后明确执行。由于IUnitOfWork在Windows服务中的作用域非常不同,您可能需要一些显式代码或显式注册来处理此问题。但是,请确保您的MyService没有注意到这一点:它不需要在意。

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

最新更新