2014-11-15 1 views
0

Я реализую решение, использующее EF-код, сначала с шаблоном репозитория и единицей работы для правильного разделения. Я с ума схожу, пытаясь найти правильный подход.Код EF сначала с репозиторием и единицей работы

Так что мое решение выглядит следующим образом:

  1. DataAccess проекта, в котором я пишу код первые классы (CurrentY У меня есть только одно: Posts.cs) и написал свою DbContext, у также добавили здесь другие классы мне нужно например, для входа в систему, и я пометив их, как [NotMapped] (я знаю ... это не имеет смысла)

  2. Repository: Где я реализовал Repository Pattern и единица работы

  3. проект WCF службы: Здесь я обращаюсь к блоку работы, как:

    var posts= unitOfWork.PostRepository.Get() 
    

здесь это все хорошо, но я, возможно, придется сделать это:

unitOfWork.PostRepository.Insert(Post)  

и теперь все цели развязку DATAACCESS идет ши **, потому что мне нужно для ссылки на проект DataAccess.

Так, пара вопросов:

  1. Какой самый лучший подход, как я могу быть моделью разделены?
  2. У меня нет бизнес-уровня, вся логика, как вход в активный каталог, нормально ли это в проекте WCF?

Пожалуйста, помогите !!!

ответ

0

Проблема, о которой вы здесь рассказываете, заняла у меня много времени, чтобы получить голову вокруг нескольких лет назад. Вы определенно находитесь на правильном пути, желая разделить доступ к данным и бизнес-логику, а бизнес-логика должна быть в собственном проекте, поэтому вам нужно создать абстракцию в виде интерфейса репозитория. Что-то вроде:

interface IPostRepository 
{ 
    void Insert(Post post); 
    void Update(Post post); 
    void Delete(int postId); 
    Post GetById(int postId); 
} 

Этот интерфейс должен быть размещен в бизнес-логики проекта, так как ваш бизнес-логика должна быть в состоянии читать и записывать данные.

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

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

void InsertPost(Post post) 
{ 
    using (var db = new DbContext()) 
    { 
     var postRepository = new PostRepository(db); 
     var postService = new PostService(postRepository); 

     postService.Insert(post); 

     db.SaveChanges(); 
    } 
} 

Теперь это выглядит немного странно, поскольку PostService, похоже, должен знать о PostRepository.Но конструктор PostService выглядит следующим образом:

public PostService(IPostRepository postRepository) 
{ 
    _postRepository = postRepository; 
} 

Руководство строительство PostRepository и PostService в приведенном выше примере, далеко от идеала. Я бы порекомендовал вам взглянуть на контейнер с инверсией управления, который делает большую часть этой развязки и расслоения ветром. Есть несколько вариантов: Autofac, Unity, Ninject и т. Д.

+0

Может ли EF быть репозиторием и UoF самостоятельно без каких-либо дополнительных интерфейсов? Вот статья, в которой описывается подход к использованию mocks по адресу http://msdn.microsoft.com/en-us/data/dn314429. Таким образом, похоже, что EF обеспечивает некоторое разделение проблем между доступом к данным и бизнес-уровнем. – Artyom

+0

Ну, я сам не использовал себя, но не думаю, что они меняют тот факт, что ваша бизнес-логика не должна знать, как хранятся ваши бизнес-данные. Например, вы должны стремиться к тому, чтобы заменить EF другим типом хранилища (на основе файлов, другим db и т. Д.) Без необходимости менять одну строку кода на вашем бизнес-уровне. –