2016-06-02 2 views
1

Я создал приложение Silverlight, и я хочу реализовать его через службы WCF RIA. В моем решении есть 3 проекта:IUnitOfWork для конструктора DomainService с использованием контейнера Unity

  1. Библиотека уровня доступа к данным, которая содержит всю логику и сущности db. Я буду использовать IUnitOfWork интерфейс для общения с ним:

    public interface IUnitOfWork : IDisposable 
    { 
        IRepository<Customer> Customers { get; } 
        IRepository<Product> Products { get; } 
        IRepository<Order> Orders { get; } 
        void Save(); 
    } 
    
  2. WCF RIA Services проект, в котором я создал пользовательский 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. Не могли бы вы мне помочь. Благодарю.

ответ

1

DomainService предоставляет статическое свойство, называемое DomainService.DomainServiceFactory.

Вам потребуется специальный класс, который реализует IDomainServiceFactory

interface IDomainServiceFactory 
{ 
    DomainService CreateDomainService(Type domainServiceType, DomainServiceContext context); 
    void ReleaseDomainService(DomainService domainService) 
} 

Я скопировать и вставить запись в блоге Фредрик 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>(); 
} 
+0

Спасибо! Это действительно то, что мне нужно. Я сам реализую такое решение раньше) – Dmitry

Смежные вопросы