【问题标题】:IUnitOfWork to DomainService constructor using Unity container使用 Unity 容器的 IUnitOfWork 到 DomainService 构造函数
【发布时间】:2016-06-02 08:55:14
【问题描述】:

我创建了 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 类。它的构造函数采用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 类。然后将我的 IoC 绑定放入其中,然后将其注册到 Global.asax.cs 文件中。你能帮我吗。谢谢。

【问题讨论】:

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


    【解决方案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>();
    }
    

    【讨论】:

    • 谢谢!这真的是我需要的。我之前自己实施了这样的解决方案)
    猜你喜欢
    • 2011-01-10
    • 1970-01-01
    • 2013-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多