3

我有幾個AutoFac和IoC入門問題。然而,我們有一個工作中的應用程序,我從頭開始,並且無法看到兩者之間的差異。AutoFac DbContext問題 - 模型創建時無法使用

我正在通過一個簡單的AJAX頁面測試這個頁面,該頁面通過ServiceStack API調用服務層。當使用MockRepositories這個工作正常,所以我知道事情的一面正在工作。

但是,當我使用實體框架替換模擬,儘管所有註冊似乎都是正確的並且正常工作,但我得到錯誤「在創建模型時無法使用上下文」。

我已包括下面我的代碼:

public class SomeObject 
{ 
    public int Id { get; set; } 
} 



public class IoCExampleContext : DbContext, IIoCExampleContext 
{ 

    public IDbSet<SomeObject> SomeObjects { get; set; } 

    static IoCExampleContext() 
    { 
     Database.SetInitializer(new IoCExampleDatabaseInitilizer()); 
    } 

    public IoCExampleContext(string connectionStringName) 
     : base(connectionStringName) 
    { 
     Configuration.ProxyCreationEnabled = false; 
    } 

    public IoCExampleContext() 
     : this("name=IoCExample") 
    {} 


    public string ConnectionString 
    { 
     get { return Database.Connection.ConnectionString; } 
    } 


    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 
     BuildModels(modelBuilder); 
    } 

    private void BuildModels(DbModelBuilder builder) 
    { 
     var typeToUse = typeof(SomeObjectModelBuilder); 
     var namespaceToUse = typeToUse.Namespace; 

     var toReg = Assembly 
         .GetAssembly(typeToUse) 
         .GetTypes() 
         .Where(type => type.Namespace != null && type.Namespace.StartsWith(namespaceToUse)) 
         .Where(type => type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>)); 

     foreach (object configurationInstance in toReg.Select(Activator.CreateInstance)) 
     { 
      builder.Configurations.Add((dynamic)configurationInstance); 
     } 
    } 
} 



public class IoCExampleDatabaseInitilizer : CreateDatabaseIfNotExists<IoCExampleContext> 
{ 
    protected override void Seed(IoCExampleContext context) 
    { 
    } 
} 



public interface IRepository<TEntity> where TEntity : class 
{ 
    IQueryable<TEntity> GetQuery(); 
    IEnumerable<TEntity> GetAll(); 
    IEnumerable<TEntity> Where(Expression<Func<TEntity, bool>> predicate); 

    // ...Various "standard" CRUD calls 
} 



public class GenericRepository<TEntity> : IRepository<TEntity> where TEntity : class 
{ 
    protected DbContext _context; 
    private readonly DbSet<TEntity> _dbSet; 

    public GenericRepository(DbContext context) 
    { 
     _context = context; 
     _dbSet = _context.Set<TEntity>(); 
    } 

    public IQueryable<TEntity> GetQuery() 
    { 
     return _dbSet; 
    } 

    public IEnumerable<TEntity> GetAll() 
    { 
     return GetQuery().AsEnumerable(); 
    } 

    public IEnumerable<TEntity> Where(Expression<Func<TEntity, bool>> predicate) 
    { 
     return GetQuery().Where(predicate); 
    } 

    // ...Various "standard" CRUD calls 

    public void Dispose() 
    { 
     OnDispose(true); 
    } 

    protected void OnDispose(bool disposing) 
    { 
     if (disposing) 
     { 
      if (_context != null) 
      { 
       _context.Dispose(); 
       _context = null; 
      } 
     } 
    } 
} 


public class DependencyBootstrapper 
{ 
    private ContainerBuilder _builder; 

    public IContainer Start() 
    { 
     _builder = new ContainerBuilder(); 
     _builder.RegisterFilterProvider(); 
     RegisterControllers(); 
     return _builder.Build(); 
    } 

    private void RegisterControllers() 
    { 
     RegisterAssembly(Assembly.GetExecutingAssembly()); 
     _builder.RegisterModelBinderProvider(); 

     RegisterPerLifetimeConnections(); 
     RegisterRepositories(); 
     RegisterServices(); 
    } 

    private void RegisterAssembly(Assembly assembly) 
    { 
     _builder.RegisterModelBinders(assembly); 
     _builder.RegisterControllers(assembly); 
    } 

    private void RegisterRepositories() 
    { 
     _builder.RegisterGeneric(typeof(GenericRepository<>)).As(typeof(IRepository<>)); 
     _builder.RegisterType<GenericRepository<SomeObject>>().As<IRepository<SomeObject>>(); 
     //... More registrations 
    } 

    private void RegisterServices() 
    { 
     _builder.RegisterType<SomeObjectService>().As<ISomeObjectService>(); 
     //... More registrations 
    } 

    private void RegisterPerLifetimeConnections() 
    { 
     const string connectionStringName = "IoCExample"; 
     _builder.RegisterType<IoCExampleContext>() 
      .As<DbContext>() 
      .WithParameter("connectionStringName", connectionStringName) 
      .InstancePerLifetimeScope(); 

     _builder.Register(c => new HttpContextWrapper(HttpContext.Current)) 
      .As<HttpContextBase>(); 
    } 
} 

我不知道這是否是相關的,但因爲我們無法獲得訪問我們調用通過PreApplicationStartMethod.OnPreApplicationStart引導程序在Global.asax方法(這據我所知,與Application_Start幾乎相同)。

有點令人擔憂的是,當我在連接字符串上啓用多個活動結果集時它會起作用 - 這會暗示我註冊DbContext的方式不正確,並且它跨越多個上下文。

任何人都可以發現我要去哪裏錯了嗎?

+0

我面臨同樣的問題。你找到任何出路了嗎? – bhuvin 2013-05-22 09:02:33

回答

0

連接字符串是問題。確保你在web/app.comfig中正確設置了它。

相關問題