Что делает конструктор GenericRepository? - PullRequest
0 голосов
/ 03 мая 2018

Согласно моему пониманию GenericRepository наследуется от IGenericRepository. Он имеет свойства IDbFactory DbFactory, DBCustomerEntities dbContext и DBCustomerEntities DbContext. Мы получаем значение для DBCustomerEntities dbContext, используя Init метод IDbFactory, который фактически инициализирует базу данных.

Мой вопрос: зачем нужен конструктор GenericRepository и какова его роль?

public class GenericRepository<T> : IGenericRepository<T> where T : class  
{   
    private DBCustomerEntities dbContext;  

    protected IDbFactory DbFactory  
    { get; private set; }  

    protected DBCustomerEntities DbContext  
    {
        get { return dbContext ?? (dbContext = DbFactory.Init()); }  
    }  

    public GenericRepository(IDbFactory dbFactory)  
    {  
        DbFactory = dbFactory;  
    }  

    public IQueryable<T> GetAll()  
    {  
        return DbContext.Set<T>();  
    }   

1 Ответ

0 голосов
/ 03 мая 2018

зачем нужен конструктор GenericRepository и какова его роль?

Поскольку вам нужно внедрить реализацию IDbFactory в GenericRepository, чтобы она заработала. Кроме того, вы ищете абстракцию , как создается экземпляр DbContext с использованием фабрики, поэтому вы не хотите видеть, как создается сама фабрика.

IMO, фактическое использование IDbFactory кажется уродливым, чтобы просто избегать некоторых строк, и это может быть решено следующим образом (что, на самом деле, экономит больше строк!):

public class GenericRepository<T> : IGenericRepository<T> where T : class  
{
    public GenericRepository(IDbFactory dbFactory)  
    {  
        DbContext = new Lazy<DBCustomerEntities>(dbFactory.Init);
    } 


    protected Lazy<DBCustomerEntities> DbContext { get; }

    public IQueryable<T> GetAll() => DbContext.Value.Set<T>();
    .......

Если вам нужно инициализировать что-то один раз, только если вы обращаетесь к нему, вы должны использовать Lazy<T>.

Есть еще одна вещь, которая выглядит менее многообещающей, и это то, что вы создаете хранилище, опираясь на IQueryable<T>. Пожалуйста, ознакомьтесь с другими вопросами и ответами: Шаблон проектирования репозитория , чтобы получить больше информации по этой теме.

...