Я не могу понять, чего вы пытаетесь достичь, но я высказываю предположение о том, что является закрытой полулогической вещью в моей голове.
Сначала освободите своего делегата.(Или объясните, для чего это).Определите свой UserDataAccess следующим образом:
public class UserDataAccess : IUserDataAccess
{
private readonly IRepository<User> _userRepository;
public UserDataAccess(IRepository<User> userRepository)
{
_userRepository = userRepository;
}
}
Теперь ваша регистрация будет выглядеть примерно так:
DataContextAdapter context = new DataContextAdapter();
UnityContainer unityContainer = new UnityContainer();
unityContainer.RegisterType(typeof (IRepository<>), typeof (Repository<>));
unityContainer.RegisterType<IUserDataAccess, UserDataAccess>();
unityContainer.RegisterInstance<IDataContextAdapter>(context);
И тогда вы решите так:
IUserDataAccess test = unityContainer.Resolve<IUserDataAccess>();
UserDataAccessбудет создан и правильный конструктор закрытого типа <> будет введен в конструктор.В свою очередь, DataContextAdapter будет добавлен в конструктор хранилища <>.
ОБНОВЛЕНИЕ 1
На основе информации в исходном вопросе, ссылка на которую вы предоставили выше, есть ли причина, по которой следующее не будет работать для вас?
unityContainer.RegisterType(typeof (IRepository<>), typeof (Repository<>));
unityContainer.RegisterType<IUserDataAccess, UserDataAccess>();
DataContextAdapter context1 = new DataContextAdapter();
DataContextAdapter context2 = new DataContextAdapter();
IUnityContainer container1 = unityContainer.CreateChildContainer();
IUnityContainer container2 = unityContainer.CreateChildContainer();
container1.RegisterInstance<IDataContextAdapter>(context1);
container2.RegisterInstance<IDataContextAdapter>(context2);
IUserDataAccess test1 = container1.Resolve<IUserDataAccess>();
IUserDataAccess test2 = container2.Resolve<IUserDataAccess>();
Я до сих пор не вижу причин для сложности с делегатами и фабрикой инъекций.Вам нужны разные контексты данных в разных путях кода, поэтому просто вставьте разные экземпляры в ваш контейнер, как показано ниже.Вы можете утилизировать контейнер, когда он вам больше не нужен.
Есть ли что-то еще из ваших требований, которое осталось невыполненным этим решением?
ОБНОВЛЕНИЕ 2
В ответ на ваш комментарий выше, я хотел бы уточнить, что вам не нужно регистрировать или создавать экземпляры контекстов заранее с подходом выше,Вы можете сделать это прямо на сайте, где вы их используете:
// When you need context, obtain it
DataContextAdapter context1 = new DataContextAdapter();
//Register it for the local scope
IUnityContainer container1 = unityContainer.CreateChildContainer();
container1.RegisterInstance<IDataContextAdapter>(context1);
// Resolve the dependency
IUserDataAccess test1 = container1.Resolve<IUserDataAccess>();
// Use your interface
......
// Release and dispose your context
container1.Dispose
Главное, что нужно убрать, это то, что вы сами контролируете, где и когда создавать их экземпляры