2011-11-17 106 views
1

以提供基類參數我已經得到了一個基類,像這樣......避免其在C#

public class BaseController : Controller 
{ 
    private readonly IUserRepository userRepository; 

    public BaseController(IUserRepository userRepository) 
    { 
     this.userRepository = userRepository; 
    } 
} 

我想我所有的MVC控制器從這個類繼承。有沒有什麼辦法可以避免必須從這樣的每個子類構造函數向基類提供'userRepository'實例?

public HomeController(IUserRepository repository) : base(repository) 
{ 
} 

乾杯,伊恩。

+0

你的意思是讓它在子類中可見嗎? – Tudor

+0

如果在子類的構造函數中沒有代碼,則不要聲明'HomeController',那麼將調用BaseController。 –

+0

我很害怕這是不可能的。由於基類沒有0個參數構造函數,因此必須提供一個將調用基構造函數的構造函數。 – Beku

回答

0

我想我已經得到它......當爲IoC容器註冊控制器時,檢查它們是否從基類繼承,然後如果是這樣,則向映射添加一些屬性注入。瞧!

我已經在思考這是否是一個糟糕的設計。是的,它節省了一些打字,並使看起來更簡單,但它打開了一些可能的重大副作用,成爲一個子類操作。即子類依賴於沒有通過構造函數或方法參數傳入的對象。他們可能甚至可能不在那裏。

1

我說過你不必在派生類中複製構造函數,答案不會。你總是可以在基類中提供一個默認的構造函數,它使用某種DI容器來獲取IUserRepository實例。

如果您安全地進行了一段時間的打字,您可以隨時提供一個包含您的構造函數的自定義T4模板。你可以在這裏找到一個例子:http://www.hanselman.com/blog/ModifyingTheDefaultCodeGenerationscaffoldingTemplatesInASPNETMVC.aspx(雖然這主要集中在視圖上,添加控制器也是如此)。

0

我所知道的唯一方法是不通過IUserRepository作爲基類的參數,而不是使用基類實例吧:

protected readonly IUserRepository UserRepository = BindingFactory.GetInstance<IUserRepository>(); 

GetInstance<T>()調用容器的Resolve() method。但這取決於您使用的IOC的類型。

0

您可以創建自定義的ControllerFactoryGlobal.asax的

ControllerBuilder.Current.SetControllerFactory(new CustomControllerFactory()) 

您CustomControllerFactory的內容進行註冊

public class CustomControllerFactory : DefaultControllerFactory 
{ 
    private readonly IUserRepository userRepository; 

    public override IController CreateController(RequestContext requestContext, string controllerName) 
    { 
     return new BaseController(userRepository); 
    } 

} 

這也是有用的,如果你正在使用依賴注入。

更多信息:

Simple Dependency Injection using a Custom MVC Controller Factory

+0

這不起作用,因爲我不僅想要返回一種類型的控制器! –

0

您可以使用從BaseController inherites一些包裝類,並把一些(什麼???)對象userRepository

public class WrapperController: BaseController 
{ 
    public WrapperController() 
    { 
     base.userRepository = someObject; 
    } 
} 
+0

這個例子不起作用。你會得到一個編譯錯誤,如:'''BaseController'不包含一個構造函數,該構造函數接受0個參數「'。 –