避免必须在C#中提供基类参数

时间:2011-11-17 12:47:05

标签: c# .net asp.net-mvc

我得到了这样的基类......

public class BaseController : Controller
{
    private readonly IUserRepository userRepository;

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

我希望我的所有MVC控制器都继承自这个类。有什么方法可以避免从这样的每个子类构造函数向基类提供'userRepository'实例吗?

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

干杯,伊恩。

5 个答案:

答案 0 :(得分:1)

我说的是你不必在派生类中复制构造函数,而答案是否定的。您总是可以在基类中提供默认构造函数,它使用某种DI容器来获取IUserRepository实例。

如果您安全地键入一些时间,您可以随时提供包含构造函数的自定义T4模板。你可以在这里找到一个例子:http://www.hanselman.com/blog/ModifyingTheDefaultCodeGenerationscaffoldingTemplatesInASPNETMVC.aspx(尽管这主要集中在视图上,添加控制器也是如此)。

答案 1 :(得分:0)

我所知道的唯一方法是不将IUserRepository作为基类的参数传递,而是使用以下方法在基类中实例化它:

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

GetInstance<T>()调用容器的Resolve() method。但这取决于您正在使用的IOC类型。

答案 2 :(得分:0)

您可以创建自定义 ControllerFactory 并在 global.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

答案 3 :(得分:0)

你可以使用一些从Base Controller继承的包装类,并将一些(what ???)对象放到userRepository

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

答案 4 :(得分:0)

我想我已经得到了...在为IoC容器注册控制器时,检查它们是否继承自基类,然后如果是这样,则为映射添加一些属性注入。瞧!

我已经考虑过这是不是一个糟糕的设计。是的,它节省了一些打字并使看起来更简单,但它为子类操作开辟了一些可能很重要的副作用。即,子类依赖于未通过构造函数或通过方法参数来的对象。他们可能会或可能不会在那里。