none
MVC2 AccountController 中初始化类成员的方法是什么意思? RRS feed

  • 问题

  • public class AccountController : Controller
        {

            public IFormsAuthenticationService FormsService { get; set; }
            public IMembershipService MembershipService { get; set; }

            protected override void Initialize(RequestContext requestContext)
            {
                if (FormsService == null) { FormsService = new FormsAuthenticationService(); }
                if (MembershipService == null) { MembershipService = new AccountMembershipService(); }

                base.Initialize(requestContext);
            }

    }

    此类中未有显式实现任何构造函数,而以重写 Initialize 方法,并调用父类 Initialize 方法实现初始化类成员。

    问题1:Initialize 是父类中的构造函数吗?

    问题2: Initialize 初始化类成员有何好处?

    问题3: 在WinForm中经常看到 Initialize 方法,并且有base. ......,在web中好像不常见,Initialize和asp.net页面生命周期中的 Init 事件有关系吗?

    问题4:请mvp给我关于Initialize,以及有关Initialize方法或事件的学习参考,技术文章,最好是 ms 官方教程。

    last, I'm very gratified by your nice answer!

    2010年4月3日 9:35

答案

  • 你好,

    如果你采用带参数的构造函数那你是否还得传两个参数进去才能初始化呢。

    那你怎么把两个参数传进去呢。System.Web.MVC实例化Controller的时候并不需要任何参数。它利用反射,不需要任何参数就返回了一个controller实例。

    Activator.CreateInstance(controllerType)

    所以我不认为自己定义一个带参数的构造函数会有用。

    之所以这样我认为有一部分是因为mvc设计的考虑,所以没有提供带参的构造函数来实例化controller,而是专门提供了一个Initialize 方法。


    Microsoft Online Community Support
    • 已标记为答案 KeFang Chen 2010年4月9日 2:42
    • 取消答案标记 dbens 2010年4月9日 6:54
    • 已标记为答案 KeFang Chen 2010年4月13日 9:53
    2010年4月6日 1:24

全部回复

  • 你好,

    1.Initialize  是ControllerBase中的函数,但不是什么构造函数。你可以通过Controller=》ControllerBase找到。

    2.利用Initialize 是否有好处得看你的需求。如果你没有需要初始化的东西根本不需要它。

    3.asp.net中也是有类似的这个方法的。比如你说的Init就是用来按照你在页面中声明的控件属性初始化控件的。这个方法2003版本以前都会自动出现在后台代码代码中,现在需要你自己写。

    4.如果你是指ASP.NET MVC 中ControllerBase的Initialize 方法,你可以从下面连接下载源码查看ControllerBase。

    http://aspnet.codeplex.com/releases/view/41742

    如果不是你可以下载个reflector来查看任何控件的OnInit方法。


    Microsoft Online Community Support
    2010年4月5日 5:52
  • 你好,

    1.Initialize  是ControllerBase中的函数,但不是什么构造函数。你可以通过Controller=》ControllerBase找到。

    2.利用Initialize 是否有好处得看你的需求。如果你没有需要初始化的东西根本不需要它。

    3.asp.net中也是有类似的这个方法的。比如你说的Init就是用来按照你在页面中声明的控件属性初始化控件的。这个方法2003版本以前都会自动出现在后台代码代码中,现在需要你自己写。

    4.如果你是指ASP.NET MVC 中ControllerBase的Initialize 方法,你可以从下面连接下载源码查看ControllerBase。

    http://aspnet.codeplex.com/releases/view/41742

    如果不是你可以下载个reflector来查看任何控件的OnInit方法。


    Microsoft Online Community Support
    protected override void Initialize(RequestContext requestContext)
            {
                if (FormsService == null) { FormsService = new FormsAuthenticationService(); }
                if (MembershipService == null) { MembershipService = new AccountMembershipService(); }

                base.Initialize(requestContext);
            }

     

    public AccountController(参数1,参数2)

    {

    FormsService =参数1;

    MembershipService =参数2;

    }

    这样的构造函数气的作用是否和它相同?

    为什么非得用Init函数,而不用构造器呢?

    2010年4月5日 10:59
  • 你好,

    1.Initialize  是ControllerBase中的函数,但不是什么构造函数。你可以通过Controller=》ControllerBase找到。

    2.利用Initialize 是否有好处得看你的需求。如果你没有需要初始化的东西根本不需要它。

    3.asp.net中也是有类似的这个方法的。比如你说的Init就是用来按照你在页面中声明的控件属性初始化控件的。这个方法2003版本以前都会自动出现在后台代码代码中,现在需要你自己写。

    4.如果你是指ASP.NET MVC 中ControllerBase的Initialize 方法,你可以从下面连接下载源码查看ControllerBase。

    http://aspnet.codeplex.com/releases/view/41742

    如果不是你可以下载个reflector来查看任何控件的OnInit方法。


    Microsoft Online Community Support
    protected override void Initialize(RequestContext requestContext)
            {
                if (FormsService == null) { FormsService = new FormsAuthenticationService(); }
                if (MembershipService == null) { MembershipService = new AccountMembershipService(); }

                base.Initialize(requestContext);
            }

     

    public AccountController(参数1,参数2)

    {

    FormsService =参数1;

    MembershipService =参数2;

    }

    这样的构造函数气的作用是否和它相同?

    为什么非得用Init函数,而不用构造器呢?


    有何好处?
    2010年4月5日 11:01
  • 你好,

    如果你采用带参数的构造函数那你是否还得传两个参数进去才能初始化呢。

    那你怎么把两个参数传进去呢。System.Web.MVC实例化Controller的时候并不需要任何参数。它利用反射,不需要任何参数就返回了一个controller实例。

    Activator.CreateInstance(controllerType)

    所以我不认为自己定义一个带参数的构造函数会有用。

    之所以这样我认为有一部分是因为mvc设计的考虑,所以没有提供带参的构造函数来实例化controller,而是专门提供了一个Initialize 方法。


    Microsoft Online Community Support
    • 已标记为答案 KeFang Chen 2010年4月9日 2:42
    • 取消答案标记 dbens 2010年4月9日 6:54
    • 已标记为答案 KeFang Chen 2010年4月13日 9:53
    2010年4月6日 1:24
  • 明白了,是否可以这样理解:

     

    Controller 实例化时,需要一个无参数的构造函数。而这个AccountController在构造时又需要传递一个参数,所以,只能通过其他方法实现这个需求,所以,Init 派上用场了?

    <html>

    2010年4月9日 6:53
  • 是的,这应该是设计时考虑的。
    Microsoft Online Community Support
    2010年4月9日 9:52