我有以下代码
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构造函数添加一个额外的标志,以识别客户端,但是在将具体类型映射到接口时,如何修改上面的代码以将硬编码值传递给该参数?
答案 0 :(得分:0)
您的Windows服务中可能会有某种MyServiceRunner
来调用您的MyService
。此类是特定于Windows服务的,这将是显式控制IUnitOfWork
生命周期的地方。或者你可以为MyService
编写一个控制工作单元的装饰器。
有几点需要注意。虽然您可以基于每个Web请求重用IUnitOfWork
,但请勿在Web请求结束时Commit
工作单元,但在服务(成功)执行后明确执行此操作。由于IUnitOfWork
的范围在Windows服务中非常不同,因此您可能需要一些显式代码或显式注册来处理此问题。但是,请确保您的MyService
对此无动于衷:它不需要关心。
如果您要在Windows服务中调用许多服务,则可能需要考虑应用命令/处理程序模式来处理业务逻辑。您可以阅读更多相关信息here。