Внедрение имени пользователя в качестве параметра конструктора в хранилище с помощью 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, не нужно абстрагироваться от их абстракции.