我完全不确定导致此异常的根本问题是什么。
我正在使用ASP.NET MVC,Unity.Mvc和Entity Framework 6.我有以下代码来注册我的存储库:
public static void RegisterTypes(IUnityContainer container)
{
// NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements.
// container.LoadConfiguration();
// TODO: Register your types here
// container.RegisterType<IProductRepository, ProductRepository>();
container.RegisterType<IGenericRepository<Customer>, GenericRepository<Customer>>();
container.RegisterType<IGenericRepository<Product>, GenericRepository<Product>>();
container.RegisterType<IGenericRepository<Order>, GenericRepository<Order>>();
container.RegisterType<IGenericRepository<OrderItem>, GenericRepository<OrderItem>>();
container.RegisterType<IGenericRepository<Supplier>, GenericRepository<Supplier>>();
}
然后在控制器中我有:
public class IndexController : Controller
{
public IndexController(IGenericRepository<Customer> testGenericRepository)
{
var result = testGenericRepository.SelectAll();
}
public ActionResult Index()
{
return View();
}
}
存储库包含以下代码:
public class GenericRepository<T> : IGenericRepository<T>
where T : class
{
private readonly DbContext _dbContext;
private readonly IDbSet<T> _dbSet;
public GenericRepository(DbContext dbContext)
{
if (dbContext == null)
{
throw new ArgumentNullException(nameof(dbContext));
}
_dbContext = dbContext;
_dbSet = _dbContext.Set<T>();
}
public IEnumerable<T> SelectAll()
{
return _dbSet.AsEnumerable<T>();
}
}
我遇到的问题是,如果我在“RegisterTypes”方法中有一个断点,我可以看到容器肯定已经注册了所有存储库,但是存储库的构造函数中的断点永远不会被命中
所以我认为断点没有被击中的事实,我没有注册“System.Data.Common.DbConnection”意味着存储库使用的DbContext
永远不会被设置。
我找不到有关如何使用Unity的“System.Data.Common.DbConnection”和实体框架中的DbContext的任何有用信息。
如何解决此问题?
答案 0 :(得分:2)
您应该添加到RegisterTypes
如何构建您的DbContext
,并且可能会使用哪个生命周期。
如果你有自己的班级(比如CustomContext
)继承自DbContext
,请注册。假设您的默认生命周期足够:
container.RegisterType<DBContext, CustomContext>();
如果直接使用DbContext
,请指示Unity应使用哪个构造函数。例如,假设您的连接字符串名为appConnectionString
:
container.RegisterType<DBContext>(
new InjectionConstructor("name=appConnectionString"));