2015-08-01 3 views
0

Я пытаюсь сделать что-то с рисунком репозиториев я сделал 3 слой WinUI, DLL и объемлет все из них ссылается рамки сущности, но моя база хранилище не работает здесь ниже кодC ошибка шаблона # хранилища DbContext

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using KuzeyYeli.ORM.Models; 

namespace KuzeyYeli.Repository 
{ 
    public class RepositoryBase<T> where T:class 
    { 

     private static NORTHWNDContext context; 
     //singelton pattern 
     public NORTHWNDContext Context 
     { 

      get { 
        if (context==null) 
          context=new NORTHWNDContext(); 
        return context; 
       } 
      set { context = value;} 
     } 

     public IList<T> Listele() 
     { 
      return Context.Set<T>.ToList(); 
     } 


    } 
} 

Set дает мне ошибку, как «не содержит определения для« set »и никакого расширения» и, кстати, когда я пишу «Контекст». я не могу видеть классы, сделанные EF, которые я действительно знаю, пожалуйста, помогите

+0

Не положительно, что это исправит вам ошибку, но вы, вероятно, захотите снять «статическую» с вашей переменной-члена. Пометить его как static делает его глобальным для всех экземпляров, которые наследуются от вашего базового класса, и он будет сохраняться во всех запросах. Не то, что вы хотите. – Sam

+0

Я знаю, но это пойнт одноэлементного шаблона, он предположил показать мне классы внутри NORTHWNDContext (это мои классы базы данных) сразу после того, как я написал «Контекст». в методе Listele –

+1

Это может быть точка одноэлементного шаблона, но шаблон singleton не имеет никакого отношения к шаблону репозитория. –

ответ

3

Весь смысл иметь шаблон хранилища - это разделить различные слои вашего приложения в дополнение к упрощению модульного тестирования вашего приложения.

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

public interface IEntity 
{ 
    string Id { get; set; } 
} 

public interface IRepository<T> where T : IEntity 
{ 
    void Add(T entity); 
    void Remove(T entity); 
    void Create(T entity); 
    T Find(string id); 
} 

Теперь вы можете реализовать этот интерфейс для любого из ваших сущностей, давайте представим, вы создаете блог, блог будет содержать сообщения правильно?

Таким образом, создать PostsRepository ...

public class Post : IEntity 
{ 
    public Post() 
    { 
     this.Id = Guid.NewGuid().ToString(); 
    } 

    public string Id { get; set;} 
} 

public class PostsRepository : IRepository<Post> 
{ 
    public void Add(Post entity); 
    /// etc 
} 

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


Теперь, когда мы знаем, что Repository шаблон, давайте перейдем к интеграции Entity Framework ...

В PostsRepository классе вы бы иметь свойство, которое может ссылаться на вашу Entity Framework DbContext. Помните, что PostsRepository представляет собой конкретную реализацию , которая будет использоваться для любого другого класса, который зависит от IRepository.


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

Представьте себе, что вы пытаетесь проверить содержание в должности, которая представляется веб-сайт ... Как изолировать логику проверки, избегая при этом каких-либо звонков в базу данных?

Вы можете либо создать ручные макетные объекты, реализующие IRepository, которые не ссылаются на EntityFramework в качестве источника данных (это долгой подход) ... или вы могли бы просто использовать доступные там рамки, такие как Moq, которые вы используете для создания поддельной реализации IRepository.


Так, короче говоря, что вам нужно, чтобы начать изучать это:

  • Dependency Inversion
  • Repository Pattern
  • декоратор
  • N-уровневая архитектура
  • Луковый архитектура

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

+0

спасибо большое, сэр, это действительно помогающая тема для меня нового ученика Ef и шаблона репозитория, и я обнаружил свою ошибку, когда я сделал ошибку в отношении визуальной студии i gues, когда я отменил свой уровень ORM к слою репозитория он сделал NOORTHWNDContext.cs, но когда я проверил, он был «пустым», когда я совпадал с контекстом слоя ORM на уровне репозитория, он исправил их, просто говоря, если кто-то все еще думает, что неправильно, просто сказал, что он исправлен. –

+0

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

+1

Также взгляните на использование шаблона Unit of Work для дальнейшего абстрагирования вашего контекста. В этом случае Entity Framework. – DDiVita