2011-03-04 89 views
0

我正在使用實現ASP.NET MembershipProvider的MVC AccountController。 我有一個所有數據庫訪問的存儲庫,其中我添加了一個返回國家/地區列表的國家/地區屬性。我想將國家下拉列表添加到註冊頁面,因此我需要能夠從我的存儲庫獲取這些數據並將其傳遞給View。 我一直在我的其他控制器中使用構造器注入,但我不知道如何將其應用於現有的AccountController。通過構造函數訪問AccountController中的存儲庫

 // This constructor is used by the MVC framework to instantiate the controller using 
    // the default forms authentication and membership providers. 

    public AccountController() 
     : this(null, null) 
    { 
    } 

    // This constructor is not used by the MVC framework but is instead provided for ease 
    // of unit testing this type. See the comments at the end of this file for more 
    // information. 
    public AccountController(IFormsAuthentication formsAuth, IMembershipService service) 
    { 
     FormsAuth = formsAuth ?? new FormsAuthenticationService(); 
     MembershipService = service ?? new AccountMembershipService(); 
    } 

我可以更改現有的AccountController構造函數來訪問我的存儲庫嗎?

回答

0

如果您已經使用ninject註冊了您的存儲庫,那麼您應該能夠向控制器的構造函數中添加第三個參數。我看到您之前對ninject的評論,但我沒有使用NinjectModule。如果您使用的是MVC 3,建議您查看nuget(http://nuget.codeplex.com)並下載Ninject.MVC3 packge,它將AppStartNinjectMvc3類添加到您的項目,您可以在其中使用內核註冊服務。綁定方法:

kernel.Bind<IThingRepository>().To<SqlThingRepository>(); 

希望這會有所幫助。

+0

我可以推薦使用Windsor,因爲它很好地實現了*組件負擔*。 – Henrik 2011-03-05 19:19:23

1

在您的IoC引擎中註冊服務,然後刪除默認構造函數。

+0

我得到它通過添加一個引用作爲第三個參數int defautl構造函數,但是這是否會打敗IoC的目的?我正在使用NInject,因此我會將它添加到NinjectModule'私人類PublicationServices:NinjectModule { } {0} {0} {0} public override void Load() { ??這裏有什麼? } }' – Brendan 2011-03-04 17:11:38

+0

我想你已經有了你的答案。但要澄清;默認c'tor是不包含任何參數的。你不做「?? new XXX();」如果您正在使用IoC,因爲這會破壞IoC的目的,您自己並不會「新增」自己的事情。 – Henrik 2011-03-05 19:25:49

+0

感謝Henrik,我還沒有正確設置我的綁定,但我現在已經開始了IoC的懸掛。 – Brendan 2011-03-07 00:25:24

0

如果你使用MVC2你應該看看http://mvcstarter.codeplex.com/它也使用Ninject。就像@Johan所說的,你只需要放入參數並將其綁定到global.asax.cs即可。

希望它有幫助!

+0

感謝溫尼,這是一個很好的例子。 – Brendan 2011-03-05 13:32:41