0

我有以下代码

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

4

1 回答 1

0

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

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

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

于 2012-03-01T12:16:45.370 回答