使用mvc 3中的unity框架实例化依赖注入的实现类

时间:2013-03-19 11:12:27

标签: asp.net-mvc-3 dependency-injection inversion-of-control unity-container ioc-container

我有一个登录控制器,它接受用户的实例,并在登录方法中调用 正确验证用户,但如果我以类似方式包含构造函数,则会在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>();

        }
    }
} 

1 个答案:

答案 0 :(得分:1)

我们可以使用this.displayUser();

UserManager userobj=new UserManager()不是必需的