Создание контекста EF4 в одном методе - PullRequest
4 голосов
/ 15 августа 2011

У меня есть много методов, подобных этому:

    public IEnumerable<Director> GetAllDirectors()
    {
        using (var dbContext = new BodModelContainer())
        {
            return dbContext.Members.OfType<Director>().ToList();
        }
    }

.. или это ..

    public Member GetMemberById(int memberId)
    {
        using(var dbContext = new BodModelContainer())
        {
            return dbContext.Members.Find(new[] {memberId});
        }
    }

или что:

    public SomeType GetOrDoSomethingWithDbBySomethingElse(T1 t1var, T2, T2 var, ...)
    {
        using(var dbContext = new BodModelContainer())
        {
            return dbContext.SomeType.DoSomething();
        }
    }

Так что я хочу реорганизоватьвсе эти методы что-то вроде:

    // create db context here
    public void InDb(Func<BodModelContainer, out SomeGenericType???> workingWithDb)
    {
         using(var dbContext = new BodModelContainer())
         {
             workingWithDb(dbContext);
         }
    }

    // using it like
    public Member GetMemberById(int memberId)
    {
            InDb((dbContext) => 
            { 
                    return dbContext.Members.Find(new[] { memberId }); 
            });
    }

Вопрос : Как сделать такой общий InDb метод, что такое SomeGenericType???

1 Ответ

3 голосов
/ 15 августа 2011

Реальная проблема, которую вы, похоже, описываете, заключается в том, что вы не можете понять, как установить тип возврата Func<>.Чтобы иметь возможность сделать этот универсальный тип, вам нужно, чтобы InDb также требовал универсального типа.

public TRet InDb<TRet>(Func<BodModelContainer, TRet> workingWithDb) {
  TRet ret = default(TRet);
  using (var dbContext = new BodModelContainer()) {
    ret = workingWithDb(dbContext);
  }
  return ret;
}

public Member GetMemberById(int memberId) {
  return InDb(dbContext => { return dbContext.Members.Find(new[] { memberId }); });
}

Должен работать (весь код здесь не тестировался) или использовать анонимные методы, которые вы могли бы иметьлокальная переменная и заставляет .Net делать всю грязную работу.

public void InDb(Action<BodModelContainer> workingWithDb) {
  using (var dbContext = new BodModelContainer()) {
    workingWithDb(dbContext);
  }
}

public Member GetMemberById(int memberId) {
  Member member;
  InDb(dbContext => { member = dbContext.Members.Find(new[] { memberId }); });
  return member;
}

Конечно, все это сказано, я не знаю, полезен ли этот уровень перенаправления / абстракции - вы делаете этонемного сложнее с небольшим ощутимым усилением (если есть).Если нет большой работы по настройке и сносу dbContext, используемого в InDb, я не думаю, что это очень полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...