У меня есть datacontext, которым я хочу поделиться с репозиториями.В большинстве реализаций рекомендуется использовать одноэлементный контейнер, поскольку он экономит затраты на перестройку всего контейнера каждый раз.Проблема заключается в том, что вам необходимо создать целый новый контейнер и все его зависимости для каждого связанного набора запросов, например:
class CompanyService : ICompanyService
{
private IUserRepository _userRepository;
private IEmployeeRepository _employeeRepository;
public CompanyService(IEmployeeRepository employeeRepository,
IUserRepository userRepository)
{
this._employeeRepository = employeeRepository;
this._userRepository = userRepository;
}
}
Службе компании требуются репозитории пользователей и сотрудников, для каждого из этих репозиториев требуется контекст:
class UserRepository : Repository<User>, IUserRepository
{
public UserRepository(IDataContext dataContext) : base(dataContext) { }
}
class EmployeeRepository : Repository<Employee>, IEmployeeRepository
{
public EmployeeRepository(IDataContext dataContext) : base(dataContext) { }
}
Я хочу иметь возможность регистрировать эти типы в контейнере следующим образом:
public WindsorContainer BuildContainer()
{
var container = new WindsorContainer();
container.Register(Component.For<SqlContext, IDataContext>());
container.Register(Component.For<UserRepository, IUserRepository>());
container.Register(Component.For<EmployeeRepository, IEmployeeRepository>());
container.Register(Component.For<CompanyService, ICompanyService>());
return container;
}
Тогда я просто хочу разрешить Сервис следующим образом:
var container = BuildContainer();
var service = container.Resolve<ICompanyService>();
Я знаю, что по умолчанию используется экземпляр singleton, я хочу, чтобы все эти службы, включая репозитории, были временными, но я хочу использовать один и тот же контекст с репозиториями, НО только для определенного набора запросов.
EDIT: ThreadLocal или основанный на запросе экземпляр НЕ БУДУТ РАБОТАТЬ, потому что, когда я разрешаю ICompanyService дважды из одного и того же потока, но используется в 2 контекстах, поток остается тем же, и экземпляр IDataContext будет таким же, однако они не должны быть.
Я не вижу способа сделать это, когда контейнер является однимтонна, единственный способ увидеть это - использовать функцию сборки для перестройки всего контейнера при каждом запросе и сделать IDataContext одиночным, а все остальное временным.
Другая проблема с этим методом - я не могу перестроить этот контейнердля моих более дорогих услуг, которые я намереваюсь быть одинокими.Каким-то образом мне нужно разделить контейнер на две части: мастер, содержащий дорогие сервисы или те, которые я не хочу перестраивать, а затем производный контейнер, который я могу использовать в своей функции сборки, которая будет просто расширять мастер и обрабатывать специфичные для контекста запросы.
Я просто неправильно смотрю на всю эту проблему, кто-то может указать мне правильное направление?
Спасибо