У меня нет идей, как настроить правильный контейнер Windsor для использования с репозиториями в приложении Windows.У меня есть общая реализация репозитория Repository, где T является типом сущности, у него есть зависимость IDatacontextProvider, которая предоставляет для него datacontext:
public class Repository<T> : IRepository<T> where T : class
{
protected DataContext DataContext;
public Repository(IDataContextProvider dataContextProvider) {
DataContext = dataContextProvider.DataContext;
}
....
}
И для простых вещей все работает нормально со следующей конфигурацией:
container.Register(
Component.For<IDataContextProvider>()
.ImplementedBy<DataContextProvider>()
.Lifestyle.Transient,
Component.For(typeof(IRepository<>))
.ImplementedBy(typeof(Repository<>))
.Lifestyle.Transient, ....
Проблемы возникают, когда я пытаюсь объединить разные объекты из нескольких репозиториев, если каждый экземпляр репозитория имеет свой экземпляр контекста данных.
Например, у меня есть простой сервис:
public class SimpleService : ISimpleService {
public SimpleService(IRepository<Order>, IRepository<OrderLine>) {
....
}
}
Iмог бы сделать IDataContextProvider в качестве Singleton, но я думаю, что это принесло бы еще большие проблемы.
Я мог бы передать IDataContextProvider в SimpleService и попытаться разрешить там экземпляры репозитория, но для этого потребовался бы дополнительный код, чтобы сделать сервис легко тестируемым, и потребовались бы дополнительные зависимости,Может быть, у кого-то есть лучшая идея, как решить эту проблему?
обновление: следуя совету, я создал фабрику хранилища (она немного отличается от предложенной в ответе, у нее нет прямой зависимости от datacontext, но идеяочень то же самое):
public interface IRepositoryFactory
{
IRepository<T> GetRepository<T>() where T:class;
}
public class RepositoryFactory : IRepositoryFactory
{
private readonly IDataContextProvider dataContextProvider;
public RepositoryFactory(IDataContextProvider dataContextProvider)
{
this.dataContextProvider = dataContextProvider;
}
public IRepository<T> GetRepository<T>() where T : class
{
return new Repository<T>(dataContextProvider);
}
}