2013-09-17 3 views
0

Я думаю, что что-то вроде следующего может работать нормально для ввода dbcontext через конструктор в мой сервисный уровень .... Кто-нибудь есть лучший способ? Кажется, однако, что _context.EntityName и т. Д. Не отображаются в intellisense, если я не передам объект фактическому классу, который наследует от dbcontext.Каков наилучший способ обертывания dbContext для DI?

public interface IContextFactory:IDisposable 
{ 
    DbContext Create(); 
} 
public class ContextFactory<TContext> : IContextFactory where TContext : DbContext, new() 
{ 
    private DbContext _context; 

    public DbContext Create() 
    { 
     _context = new TContext(); 
     _context.Configuration.LazyLoadingEnabled = true; 

     return _context; 
    } 

    public void Dispose() 
    { 
     _context.Dispose(); 
    } 
} 
+1

Вот лучшая идея: угробить контекстную завод и просто впрыснуть 'DbContext' в конструкторах. – Steven

+0

Связанный: http://stackoverflow.com/questions/10585478/one-dbcontext-per-web-request-why – Steven

ответ

0

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

container.Register<MyDbContext>(
    () => new MyDbContext("name=MyDbContext"), 
    new WebRequestLifestyle(true)); 

Где MyDbContext подкласс DbContext:

public class MyDbContext: DbContext 
{ 
    public MyDbContext(string connectionString) 
     : base(connectionString) 
    { 
     this.Configuration.LazyLoadingEnabled = true; 
    } 

    /* DbSets<SomeEntity> etc */ 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     //etc 
    } 
} 
Смежные вопросы