Я был одаренным, когда мне пришлось работать с уже настроенным приложением Ninject DI, которое я вырос и значительно добавил к разработке приложения, над которым я работаю ,Инъекция зависимостей с Ninject разделяет одни и те же объекты с разными экземплярами
Теперь я нахожу проблему, которую я хотел бы исправить. Мне удалось обойти это с помощью наследования, но хотелось бы более чистого решения.
У меня есть два подключения, которые необходимо ввести в разные службы и хранилища. Затем мне нужны репозитории, которые также должны быть правильно связаны с правильным сервисом, имеющим тот же UnitOfWork
.
Я думаю, что, возможно, я прошу чего-то, что невозможно без наследования и специализации, но именно поэтому я спрашиваю.
Мне удалось решить этот вопрос, создав подкласс классов Repository
и UnitOfWork
, но ничего не делает, кроме внедрения базового класса. Мне просто не нравится идея подкласса, полностью зависящая от функциональности суперкласса, в основном пустые фигурные скобки, помимо конструктора, для меня это не похоже на ООП, чтобы решить эту проблему. Поэтому я искал лучшего решения, используя одноклассное решение, если это возможно в DI.
Так что, если вы можете игнорировать решение я говорил о том, потому что я полностью вернулась изменение это то, что я остался с:
Глядя на код ниже вы можете увидеть, что это цель.
...
public class UnitOfWork : IUnitOfWork
{
private static readonly log4net.ILog log = log4net.LogManager.GetLogger("UnitOfWork");
public DbContext DataContext { get; set; }
public UnitOfWork(string connectionString)
{
DataContext = new DbContext(connectionString);
}
public void Commit()
{
...
}
}
...
public class Repository<T> : IRepository<T> where T : class
{
public IUnitOfWork unitOfWork { get; set; }
private readonly IDbSet<T> dbSet;
//private static readonly log4net.ILog log = log4net.LogManager.GetLogger("Repository");
public Repository(IUnitOfWork unitOfWork)
{
this.unitOfWork = unitOfWork;
dbSet = this.unitOfWork.DataContext.Set<T>();
}
...
}
...
public class IPOPDataModules : NinjectModule
{
public override void Load()
{
Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope().WithConstructorArgument("connectionString", ConfigurationManager.ConnectionStrings["IPOP_BE_TESTEntities"].ConnectionString);
Bind<IRepository<tOrder>>().To<Repository<tOrder>>().InRequestScope();
}
}
...
public class DataModules : NinjectModule
{
public override void Load()
{
Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope().WithConstructorArgument("connectionString", ConfigurationManager.ConnectionStrings["IPOP_BAPSEntities"].ConnectionString);
Bind<IRepository<Data.Quote>>().To<Repository<Data.Quote>>().InRequestScope();
}
}
...
public class QuoteService : IQuoteService
{
private IUnitOfWork unitOfWork;
private IRepository<Data.Quote> quoteRepository;
public QuoteService(IUnitOfWork unitOfWork, IRepository<Data.Quote> quoteRepository)
{
...
}
}
...
public class IPOPService : IIPOPService
{
private IUnitOfWork unitOfWork;
private IRepository<Data.tOrder> tOrderRepository;
public IPOPService(IUnitOfWork unitOfWork, IRepository<Data.tOrder>)
{
...
}
}
То, что я хочу знать, можно ли один и те же UnitOfWork
и Repository
объектов два различных соединений и иметь их вводят в разные экземпляры для соответствующих служб (IPOPService
для подключения IPOP_BE_TEST, QuoteService
для подключения IPOP_BAP)
Опять же, код выше не достигает желаемого, но это архитектура, которую я хотел бы поиграть, чтобы заставить ее работать.
Спасибо за ввод @Zoltan, я работаю над сайтом MVC, и я внес некоторые изменения в вопрос, который, надеюсь, должен устранить возникшую путаницу. Что касается ответа выше, я хочу иметь возможность как-то отобразить правильные 'UnitOfWork' и' Repository' (с правильными подключениями db) к двум различным вышеперечисленным службам. Я думаю, что мне не хватает некоторой логики Ninject, которая могла бы, если возможно, сделать что-то. – Saleh