IUnitOfWork 使用 Unity 容器到 DomainService 构造函数

IUnitOfWork to DomainService constructor using Unity container

我创建了 Silverlight 应用程序,我想通过 WCF RIA 服务实现它。我的解决方案中有 3 个项目:

  1. 包含所有数据库逻辑和实体的数据访问层库。我将使用 IUnitOfWork 接口与之通信:

    public interface IUnitOfWork : IDisposable
    {
         IRepository<Customer> Customers { get; }
         IRepository<Product> Products { get; }
         IRepository<Order> Orders { get; }
         void Save();
    }
    
  2. WCF RIA 服务项目,我在其中创建了自定义 DomainService class。它的构造函数采用 IUnitOfWork 接口参数:

    [EnableClientAccess()]
    public void StoreService : DomainService
    {
         private IUnitOfWork _repository;
         public StoreService(IUnitOfWork repository)
         {
              _repository = repository;
         }
         // ... some methods to query _repository
    }
    
  3. 客户端项目(用 WPF 编写)。

所以,我想使用 Unity IoC 容器将接口实现路径化为服务。我不明白在哪里需要创建自定义服务工厂或类似的东西以及在哪里注册它以供系统使用。例如,我知道在 ASP.NET MVC 中有 DefaultControllerFactory class 我需要派生。然后将我的 IoC 绑定放入其中,然后将其注册到 Global.asax.cs 文件中。你能帮我吗。谢谢

DomainService 公开了一个名为 DomainService.DomainServiceFactory 的静态 属性。

您需要一个实现 IDomainServiceFactory

的自定义 class
interface IDomainServiceFactory
{
  DomainService CreateDomainService(Type domainServiceType, DomainServiceContext context);
  void ReleaseDomainService(DomainService domainService)
}

我复制并粘贴了来自 Fredrik Normen how to wire up Unity to DomainService 的博客 post。

public class MyDomainServiceFactory : IDomainServiceFactory
{

    public DomainService CreateDomainService(Type domainServiceType, DomainServiceContext context)
    {
        var service = Global.UnityContainer.Resolve(domainServiceType) as DomainService;
        service.Initialize(context);

        return service;
    }


    public void ReleaseDomainService(DomainService domainService)
    {
        domainService.Dispose();
    }
}

在你的Global.asax

protected void Application_Start(object sender, EventArgs e)
{
   DomainService.Factory = new MyDomainServiceFactory();

   UnityContainer.RegisterType<StoreService>();
   UnityContainer.RegisterType<IUnitOfWork, UnitOfWorkImpl>();
}