【发布时间】:2013-03-08 00:47:06
【问题描述】:
我有一个登录控制器,它接受用户实例,并在登录方法中调用 正确验证用户,但如果我以类似方式包含构造函数,UserManager 中会出现问题
public LoginController(IUser user)
{
this.user = user;
}
[httpPost]
public ActionResult Login(UserLogin model)
{
if (ModelState.IsValid)
{
// var userMgr = new UserManager();
if (user.ValidateUser(model.UserName, model.Password))
{
return RedirectToAction("Index", "Home");
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
// return View("UserLogin");
}
问题出在下面
public class UserManager : IUser
{
IUser _user;
public UserManager(IUser user)
{
_user=user;
}
public void displayUser()
{
//.......
//.....
}
public void somefunction()
{
_user.displayUser();
}
}
我使用 UserManager() 构造函数的原因是因为我想使用 _user.displayUser()
我在 global.aspx 中做了如下配置
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
var container = Container.InitContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
和 Container.InitContainer() 调用下面的类
public static class Container
{
public static IUnityContainer InitContainer()
{
var container = new UnityContainer();
// Register the relevant types for the
// container here through classes or configuration
//container.RegisterType<IUser, UserManager>(new ContainerControlledLifetimeManager());
container.RegisterType<IUser, UserManager>(new ContainerControlledLifetimeManager());
return container;
}
我有 UnityDepdendency 解析器类如下
public class UnityDependencyResolver : IDependencyResolver
{
private IUnityContainer _container;
#region Ctor
public UnityDependencyResolver(IUnityContainer container)
{
_container = container;
}
#endregion
public object GetService(Type serviceType)
{
try
{
return _container.Resolve(serviceType);
}
catch (Exception ex)
{
return null;
}
}
public IEnumerable<object> GetServices(Type serviceType)
{
try
{
return _container.ResolveAll(serviceType);
}
catch (Exception ex)
{
return new List<object>();
}
}
}
【问题讨论】:
-
所以你有一个
UserManager必须注入到自身的类?即使没有 DI 容器,您认为这到底是如何实现的? -
您好,我是 DI 和 Unity 框架的新手,我想知道我是否可以使用构造函数在 UserManager 中设置实例的方式进行配置,是否可以这样做?因为我不想要到 UserManager 类中的用户 UserManager userobj=new UserManager()
-
但是为什么呢?在
UserManager类中创建一个新的UserManager有什么用。退后一步,看看设计。为什么不干脆做:public void somefunction() { this.displayUser(); }???
标签: asp.net-mvc-3 dependency-injection inversion-of-control unity-container ioc-container