0

对象的条件优化配置我有以下代码使用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”级。我想在HTTP请求结束时处理“工作单元”(如果客户端是web),其中客户端就像一个Windows服务,我想在每次数据库调用后处理工作单元。如何实现这一目标?我可以在MyService构造函数中添加一个额外的标志来标识客户端,但是当将具体类型映射到接口时,如何修改上述代码以将硬编码值传递给该参数?

回答

0

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

有几件事要注意。尽管您可以在每个Web请求的基础上重用IUnitOfWork,但请勿在网络请求结束时使用Commit工作单元,但在服务(成功执行)后显式执行此操作。由于您的IUnitOfWork的范围在Windows服务中有很大不同,因此您可能需要一些显式代码或显式注册来处理此问题。但是,请确保您的MyService不知道这一点:它不应该在意。

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