У меня есть следующая структура класса и интерфейса, и мне трудно заставить код делать то, что мне нужно.
public interface IUserManager
{
int Add(User user);
}
public class UserManagerA : IUserManager{}
public class UserManagerB : IUserManager{}
В этом примере я использую Ninject в качестве контейнера IoC, но я готов изменить его, если какой-либо другой контейнер решит проблему:
Это внутри моего NinjectWebCommon.cs
:
void RegisterServices(IKernel kernel)
{
string userRole = CurrentUser.Role;//this gets the user logged in
//This is the part I do not how to do
//I wish I could just type this in:
kernel.Bind<IUserManager>().To<UserManagerA>()
.When(userRole == "RoleA"); // this doesn't work obviously
kernel.Bind<IUserManager>().To<UserManagerB>()
.When(userRole == "RoleB"); // same doesn't work
}
Все это для того, чтобы в моем (MVC) контроллере я мог сделать это:
public class UserController
{
private readonly IUserManager _userManager;
public UserController(IUserManager userManager)
{
_userManager = userManager;
}
public ActionResult Add(User user)
{
//this would call the correct manager
//based on the userRole
_userManager.Add(user);
}
}
Я читал статьи об абстрактной фабрике, но не нашел ни одной, объясняющей, как интегрировать фабрику с контейнером IoC и передать параметр, полученный во время выполнения, для разрешения реализаций.
.When(r => CurrentUser.Role == "RoleA");
? - предполагая, чтоWhen
вычисляется для каждого разрешения, которое вы не хотите записывать во время установки... - person Alexei Levenkov   schedule 12.03.2015CurrentUser
вычисляется от вошедшего в систему пользователя, так что значение будет меняться при каждом запросе, разве привязкаNinject
s не происходит каждый раз при создании контроллера? - person SOfanatic   schedule 12.03.2015.When
каждый раз, когда необходимо разрешить тип, а частота разрешения по умолчанию (также известная как время жизни в Unity) - каждый раз, когда кто-то запрашивает тип... Таким образом, когда контроллер создается (по крайней мере, один раз для каждого http-запроса), он будет получитьIUserMamager
соответствиеCurrentUser.Role
.... (Может быть полностью выключен, так как я не знаю напрямую о Ninject) - person Alexei Levenkov   schedule 12.03.2015