0

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

我正在结合 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

对于我在具有接口的具体类中创建的模型存储库

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>();
4

2 回答 2

2

与其注入一个username字符串原语,不如让你DbContext依赖一个IUserContext抽象。这使您可以简单地注册您的服务,而不必诉诸于重写任何构造函数参数。

更新

您可以定义如下的 MVC 特定实现IUserContext

public class MvcUserContxt : IUserContext
{
    public string UserName
    {
        get { return HttpContext.Current.User.Identity.Name; }
    }
}

您可以按如下方式注册它:

Bind<IUserContext>().To<MvcUserContext>();
于 2012-10-24T09:37:06.093 回答
1

您可以使用WithConstructorParameter

kernel.Bind<IInterface>()
    .To<ConcreteClass>()
     .WithConstructorParameter("name", value);

但是,我敦促您不要使用存储库来抽象 DbContext。它没有真正的目的。如果你想对你的类进行单元测试并且你的数据库不是微不足道的,你最终会花费大量时间来创建模拟存储库——没有任何理由,只需使用数据库的快照进行单元测试。

微软在使用 DbContext 抽象出数据库方面做得非常好,无需抽象它们的抽象。

于 2012-10-24T09:40:18.063 回答