В своем приложении я использую репозитории для операций CRUD. Из всех сущностей некоторые не должны удаляться вообще, некоторые сущности (которые реализуют ISoftDeletable
) можно удалить только обратимо, а некоторые сущности (которые реализуют IPermanentDeletable
) могут быть удалены без возможности восстановления. (Я слежу за ответом на этот пост Универсальный репозиторий с функцией мягкого удаления )
У меня есть 3 репозитория, которые наследуются друг от друга следующим образом
BaseRepository : IRepository
SoftDeleteRepository : BaseRepository, ISoftDeleteRepository
PermanentDeleteRepository : BaseRepository, IPermanentDeleteRepository
Моя проблема в том, что я не хочу делать индивидуальную привязку для каждого из объектов разных типов, таких как
kernel.Bind(typeof(IRepository<Company>)).To(typeof(BaseRepository<Company>));
kernel.Bind(typeof(IRepository<Country>)).To(typeof(PermanentDeleteRepository<Country>));
kernel.Bind(typeof(IRepository<Contact>)).To(typeof(SoftDeleteRepository<Contact>));
Но вместо этого я хочу как-то сделать так, чтобы все привязки для IRepository
отправлялись на фабрику и создавали экземпляр репозитория в зависимости от типа сущности, которую принял его общий параметр, и внедряли его в контроллер.
Можно ли этого добиться?
public override void Load()
. что, если у меня есть и другие типы репозиториев? Например, любой объект, который не реализует ниISoftDeletable
, ниIPermanentDeletable
, должен использоватьBaseRepository
. Достаточно ли для этого вызвать base.Load() в первую очередь в методе Load, который мы переопределяем? 11.03.2014Module : NinjectModule
, который затем загружаетсяIKernel.Load<Module>()
. Вы также можете создать привязки с помощьюIKernel.Bind(...)
- это не имеет значения. На ваш вопрос о других объектах: вы должны создать третью привязку, привязку по умолчанию:IBindingRoot.Bind(typeof(IRepository<>)).To(typeof(BaseRepository<>));
. Когда есть несколько привязок, ninject будет использовать одну с.When(...)
, прежде чем использовать другую без. 11.03.2014