【问题标题】:instantiate the implementation class of Depenency injection using unity framework in mvc 3在mvc 3中使用unity框架实例化依赖注入的实现类
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2020-02-21
    • 2015-10-25
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    相关资源
    最近更新 更多