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

时间:2016-06-02 08:55:15

标签: c# silverlight unity-container data-access-layer ria

我创建了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. 我创建了自定义 DomainService 类的WCF RIA Services项目。它的构造函数采用 IUnitOfWork 接口参数:

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

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

1 个答案:

答案 0 :(得分:1)

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

您需要一个实现IDomainServiceFactory

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

我复制并粘贴了Fredrik Normen how to wire up Unity to DomainService的博文。

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>();
}