Внедрение имени пользователя в качестве параметра конструктора в хранилище с помощью Ninject

Я нашел несколько вопросов, используя передачу параметров в конструктор, но я не могу перевести это к моей конкретной проблеме.

Я изучаю EF codefirst в сочетании с MVC.

Я создал абстрактный класс и интерфейс в качестве основы:

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 ответа

Вместо того, чтобы вводить username Строка примитива, просто пусть ваш DbContext зависит от IUserContext абстракция. Это позволяет вам просто зарегистрировать ваши службы, не прибегая к переопределению аргументов конструктора.

ОБНОВИТЬ

Вы можете определить конкретную реализацию MVC IUserContext следующее:

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

И вы можете зарегистрировать его следующим образом:

Bind<IUserContext>().To<MvcUserContext>();

Ты можешь использовать WithConstructorParameter:

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

Тем не менее, я призываю вас не использовать репозитории для абстрагирования от DbContext. Это не служит никакой реальной цели. Если вы хотите провести модульное тестирование своих классов и ваша база данных не является тривиальной, вы в конечном итоге потратите много времени на создание фиктивных репозиториев - без всякой причины, просто на модульное тестирование со снимком базы данных.

Microsoft проделала отличную работу по абстрагированию базы данных с помощью DbContext, не нужно абстрагироваться от их абстракции.

Другие вопросы по тегам