使用Ninject将username作为构造函数参数注入存储库

时间:2012-10-23 15:17:04

标签: .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> 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>();

2 个答案:

答案 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抽象数据库做得非常好,无需抽象抽象。