2015-11-03 8 views
0

Это может быть вопрос с миллионным ответом, но это меня очень беспокоит.DbContext, Inject или To Inject?

У меня есть приложение mvc, использующее EF. Теперь я вставляю DbContext в свои бизнес-объекты или я делаю это по-другому?

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

например

var test=(from d in context.Set<User>() where d.Username=="testname" select d).FirstOrDefault(); 

по сравнению с набранным прелестью

var test=(from d in context.Users where d.Username=="testname" select d).FirstOrDefault(); 

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

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

Так мы вводим, и если да, то почему-то получится типичный контекст?

Или мы не вводим?

+0

не уверен, что проблема с уром. если u использует код, созданный кодом dbcontext, u должен иметь .Users. – Kelmen

+0

Да, как и во втором примере. Однако, если вы используете инъекцию, базовый класс DbContext должен использоваться, а не генерироваться. – coolblue2000

+0

Пожалуйста, проверьте эту статью: http://mehdi.me/ambient-dbcontext-in-ef6 –

ответ

0

Во-первых, я думаю, что может возникнуть некоторое недоразумение в терминах «инъекция».

Вводят означает следующее:

public class UserService 
{ 
    MyContext _db; 

    public UserService(MyContext db) 
    { 
     _db = db; 
    } 

    public void GetUserById(string id) 
    { 
     _db.Users.First(x => x.Id = id); 
    } 
} 

Вместо этого:

public class UserService 
{ 
    MyContext _db = new MyContext(); 

    public UserService() 
    { 
    } 

    public void GetUserById(string id) 
    { 
     _db.Users.First(x => x.Id = id); 
    } 
} 

Обратите внимание, как в первом примере MyContext является 'впрыскивается' в конструктор. Во втором примере UserService сам создает новый экземпляр MyContext.

Теперь, не так ли? Я считаю, что вам следует, и на самом деле это приемлемая практика. Прежде чем вы это сделаете, обязательно прочитайте и попробуйте в нескольких примерах проектов, чтобы узнать, какие выгоды он приносит вам. Wikipidia: Dependency Injection Advantages

+0

Извините, да, я знаю, что такое инъекция (хотя я должен был это сделать). Однако инъекция приводит к использованию базового класса или интерфейса (в противном случае это будет точка?), Поэтому мой вопрос. – coolblue2000

+0

@ coolblue2000 ах, я вижу проблему. Нет, «инъекция» не означает использование базового класса. Вы можете ввести свой «типизированный» контекст без проблем. Чем больше разговор, «мы должны зависеть от конкретного или от абстракции?» Это более сложный вопрос: P – hatcyl

+0

Да, хотя можно ввести конкретный тип, какой будет точка, поскольку вам не лучше, чем просто определить конкретный тип как неинжектированную зависимость .... – coolblue2000