2013-10-15 2 views
1

Я реализовал шаблон хранилища. У меня есть классы базовой модели, которые являются не более чем стандартными классами C#. У меня есть классы репозитория для каждой модели. У меня есть класс DbContext. Я использую Ninject, поэтому все, кроме моих моделей, сначала определяется как интерфейсы. Прямо сейчас, чтобы получить доступ к моим данным, мой код выглядит следующим образом:Как перейти от отдельных репозиториев к уровню обслуживания?

using (var context = m_kernel.Get<IPortalContext>()) 
{ 
    var accounts = m_kernel.Get<IAccountRepository>(new ConstructorArgument("context", context)); 

    foreach (var account in accounts.All()) 
    { 
     Assert.IsNotNull(account); 
    } 
} 

Примечание: Я не уверен, если есть лучший способ сказать, что я хочу передать этот контекст в конструктор IAccountRepository, но это для в другой раз.

Как вы можете видеть, для моих классов репозитория требуется экземпляр контекста. Это значит, что я работаю в одном и том же контексте, как единица работы.

Вопрос в том, как я могу представить сервисный уровень для моей бизнес-логики? Прямо сейчас у моих репозиториев просто есть простые методы Get, Delete, All, Insert. Я хочу уровень сервиса для своей конкретной бизнес-логики и проверки. Каков наилучший способ сделать это?

На первый взгляд, я мог бы просто сделать классы обслуживания, подобно моим классам репо, которые принимают контекст и выполняют бизнес-логику, а затем используют класс репо. Это в основном спрятало бы хранилища.

Это хороший подход?

ответ

1

Это подход, который я использую. Это также позволит вам сделать ваши репозитории родовыми. Вот пример:

Internal class AccountService 
{ 
    Public Account GetAccount(string firstName) 
    { 
     var results = Enumerable.Empty<Account>(); 

     try 
     { 
      var repository = new Repository<Account>(); // I use and interface here and      
                 // then a factory class. I just 
                 // was trying to keep it simple. 
      results = repository.FindAll() 
       .Where(a => a.FirstName == firstName) 
       .ToList(); 
     } 
     catch()... etc. 

     return results; 
    } 
} 

Public interface IAccountService 
{ 
    Account GetAccount(string accountNumber); 
} 

Используя эту модель, что позволяет издеваться результаты ваших классов репозиториев и модульного тестирования ваших методов класса услуг, а затем, потому что вы используете интерфейс для класса обслуживания вы можете дразнить результаты ваших методов Сервиса, если это необходимо, если вы тестируете устройство на уровне вашего UI ...

Также я успешно создал общие классы репозитория для LinqToSql и EntityFramework, поэтому я могу изменить рамки, а остальная часть приложения не заботится.

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