Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用Ninject将用户名作为构造函数参数注入存储库_.net_Entity Framework_Dependency Injection_Ef Code First_Ninject - Fatal编程技术网

.net 使用Ninject将用户名作为构造函数参数注入存储库

.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

我在将参数传递给构造函数时发现了几个问题,但我无法将其转化为我的具体问题

我正在结合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
公共抽象类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
与您的EF
DbContext
无关。它是一种抽象,允许应用程序逻辑获取有关当前用户的信息。它在应用程序的较低层中定义,而
MvcUserContext
将在web应用程序中定义。换句话说,您的
MvcUserContext
依赖于
HttpContext
,但
IUserContext
不依赖于此。但是,与其通过覆盖
SaveChanges
滥用
DbContext,不如在围绕业务操作的装饰器中实现此行为。看一看。但是,请注意,这是高级的shizzle,因此您可能会