我使用参数传递给构造函数发现了几个问题,但我无法将其转换为我的具体问题。
我正在和MVC一起研究EF codefirst。
我创建了一个抽象类和一个接口作为基础:
public abstract class RepositoryBase<C, T> : IRepositoryBase<T>
where T: class where C : DbContext, new()
public interface IRepositoryBase<T> where T : class
我的模型存储库iv'e在带有接口的具体类中创建
public interface ICustomerRepository : IRepositoryBase<Customer>
public class CustomerRepository: RepositoryBase<PNMP, Customer>,
ICustomerRepository
PNMP(我的代码第一个上下文)只有一个构造函数,它接受用户身份以跟踪更改设置内部参数_username
public override int SaveChanges()
{
var changeSet = ChangeTracker.Entries<IDatabaseBaseType>();
if (changeSet != null)
{
var modifiedEntries =
changeSet.Where(c => c.State== EntityState.Modified);
foreach (var entry in modifiedEntries)
{
entry.Entity.ModifiedDate = DateTime.Now;
entry.Entity.ModifiedBy = _username;
}
var addedEntries =
changeSet.Where(c => c.State == EntityState.Added);
foreach (var entry in addedEntries)
{
entry.Entity.CreatedDate = DateTime.Now;
entry.Entity.CreatedBy = _username;
}
}
return base.SaveChanges();
}
如何将我的身份变量传递给PNMP(上下文)的构造函数
我正在使用Ninject.MVC3将具体类绑定到接口:
kernel.Bind<ICustomerRepository>().To<CustomerRepository>();
答案 0 :(得分:2)
不要注入username
字符串原语,只需让DbContext
依赖于IUserContext
抽象。这允许您简单地注册您的服务,而不必诉诸于覆盖任何构造函数参数。
<强>更新强>
您可以按如下方式定义IUserContext
的MVC特定实现:
public class MvcUserContxt : IUserContext
{
public string UserName
{
get { return HttpContext.Current.User.Identity.Name; }
}
}
您可以按如下方式注册:
Bind<IUserContext>().To<MvcUserContext>();
答案 1 :(得分:1)
您可以使用WithConstructorParameter
:
kernel.Bind<IInterface>()
.To<ConcreteClass>()
.WithConstructorParameter("name", value);
但是,我建议不使用存储库来抽象掉DbContext。它没有任何实际意义。如果你想对你的类进行单元测试而你的数据库不是很容易,你最终会花费大量时间来创建模拟存储库 - 无论如何,只需要用数据库的快照进行单元测试。
微软用DbContext抽象数据库做得非常好,无需抽象抽象。