.net 使用Ninject将用户名作为构造函数参数注入存储库
我在将参数传递给构造函数时发现了几个问题,但我无法将其转化为我的具体问题 我正在结合MVC学习EF codefirst 我创建了一个抽象类和一个接口作为基础:.net 使用Ninject将用户名作为构造函数参数注入存储库,.net,entity-framework,dependency-injection,ef-code-first,ninject,.net,Entity Framework,Dependency Injection,Ef Code First,Ninject,我在将参数传递给构造函数时发现了几个问题,但我无法将其转化为我的具体问题 我正在结合MVC学习EF codefirst 我创建了一个抽象类和一个接口作为基础: public abstract class RepositoryBase<C, T> : IRepositoryBase<T> where T: class where C : DbContext, new() public interface IRepositoryBase<T> whe
public abstract class RepositoryBase<C, T> : IRepositoryBase<T>
where T: class where C : DbContext, new()
public interface IRepositoryBase<T> where T : class
公共抽象类RepositoryBase:IRepositoryBase
其中T:class,其中C:DbContext,new()
公共接口IRepositoryBase,其中T:class
对于我的模型存储库,iv'e是在带有接口的具体类中创建的
public interface ICustomerRepository : IRepositoryBase<Customer>
public class CustomerRepository: RepositoryBase<PNMP, Customer>,
ICustomerRepository
公共接口ICCustomerRepository:IRepositoryBase
公共类CustomerRepository:RepositoryBase,
ICustomerRepository
PNMP(my code first context)只有一个构造函数,它接受用户标识以跟踪设置内部参数\u 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();
}
public override int SaveChanges()
{
var changeSet=ChangeTracker.Entries();
if(变更集!=null)
{
牙列变异=
其中(c=>c.State==EntityState.Modified);
foreach(修改项中的var条目)
{
entry.Entity.ModifiedDate=DateTime.Now;
entry.Entity.ModifiedBy=\u用户名;
}
附加值=
其中(c=>c.State==EntityState.Added);
foreach(附加项中的var条目)
{
entry.Entity.CreatedDate=DateTime.Now;
entry.Entity.CreatedBy=\u用户名;
}
}
返回base.SaveChanges();
}
如何将标识变量传递给PNMP(上下文)的构造函数
我使用Ninject.MVC3将具体类绑定到接口,使用:
kernel.Bind<ICustomerRepository>().To<CustomerRepository>();
kernel.Bind().To();
与其注入用户名
字符串原语,不如让您的DbContext
依赖于IUserContext
抽象。这使您可以简单地注册服务,而不必重写任何构造函数参数
更新
您可以定义IUserContext
的特定于MVC的实现,如下所示:
public class MvcUserContxt : IUserContext
{
public string UserName
{
get { return HttpContext.Current.User.Identity.Name; }
}
}
Bind<IUserContext>().To<MvcUserContext>();
您可以按如下方式注册:
public class MvcUserContxt : IUserContext
{
public string UserName
{
get { return HttpContext.Current.User.Identity.Name; }
}
}
Bind<IUserContext>().To<MvcUserContext>();
Bind().To();
与其注入用户名
字符串原语,不如让您的DbContext
依赖于IUserContext
抽象。这使您可以简单地注册服务,而不必重写任何构造函数参数
更新
您可以定义IUserContext
的特定于MVC的实现,如下所示:
public class MvcUserContxt : IUserContext
{
public string UserName
{
get { return HttpContext.Current.User.Identity.Name; }
}
}
Bind<IUserContext>().To<MvcUserContext>();
您可以按如下方式注册:
public class MvcUserContxt : IUserContext
{
public string UserName
{
get { return HttpContext.Current.User.Identity.Name; }
}
}
Bind<IUserContext>().To<MvcUserContext>();
Bind().To();
您可以将与构造函数参数一起使用
:
kernel.Bind<IInterface>()
.To<ConcreteClass>()
.WithConstructorParameter("name", value);
kernel.Bind()
.至()
.带构造函数参数(“名称”,值);
但是,我敦促您不要使用存储库来抽象DbContext。它没有真正的用途。如果你想对你的类进行单元测试,而你的数据库又不是琐碎的,那么你最终会花费大量的时间来创建模拟存储库——毫无理由,只需要对数据库的快照进行单元测试
Microsoft使用DbContext对数据库进行了非常出色的抽象,无需抽象它们的抽象。您可以使用
和ConstructorParameter
:
kernel.Bind<IInterface>()
.To<ConcreteClass>()
.WithConstructorParameter("name", value);
kernel.Bind()
.至()
.带构造函数参数(“名称”,值);
但是,我敦促您不要使用存储库来抽象DbContext。它没有真正的用途。如果你想对你的类进行单元测试,而你的数据库又不是琐碎的,那么你最终会花费大量的时间来创建模拟存储库——毫无理由,只需要对数据库的快照进行单元测试
Microsoft使用DbContext对数据库进行了非常出色的抽象,无需抽象它们的抽象。如果要将用户标识传递到上下文,为什么要将
DbContext,new()
指定为泛型类型约束。请看。它显示了EF的存储库和工作单元模式的实现。如果要将用户标识传递给上下文,为什么要将DbContext,new()
指定为泛型类型约束。请参阅。它展示了EF的存储库和工作单元模式的实现。Steven,感谢您提供的信息,但正如我所说的。我还在学习,是一名初级开发人员。关于我的问题,我认为有一个问题我没有看到,现在我不知道答案。作为MVC应用程序的一部分传入用户名只有在知道上下文的生存期时才可能。是为具有自己上下文的每个用户反复创建和处理每个请求的上下文。有了你的回答,有没有一个地方可以让我找到一些额外的信息来处理这个问题?史蒂文,我想我遗漏了一些东西。我有一个名为PNMP的codefirst上下文。您将介绍MvcUserContext和接口IUserContext。IUserContext是一个自写接口(我假设是)。我的MvcUserContext放在哪里。我有3个项目。1个是de cf模型,1个是存储库,1个是MVC网站。PNMP上下文放在我的存储库项目中,其中没有HttpContext在范围内。(或者是吗?@LuukKrijnen:IUserContext
与您的EFDbContext
无关。它是一种抽象,允许应用程序逻辑获取有关当前用户的信息。它在应用程序的较低层中定义,而MvcUserContext
将在web应用程序中定义。换句话说,您的MvcUserContext
依赖于HttpContext
,但IUserContext
不依赖于此。但是,与其通过覆盖SaveChanges
滥用DbContext,不如在围绕业务操作的装饰器中实现此行为。看一看。但是,请注意,这是高级的shizzle,因此您可能会