我有一个基类,就像这样...
public class BaseController : Controller
{
private readonly IUserRepository userRepository;
public BaseController(IUserRepository userRepository)
{
this.userRepository = userRepository;
}
}我希望我所有的MVC控制器都继承自这个类。有没有什么方法可以避免像这样从每个子类构造函数向基类提供“userRepository”实例?
public HomeController(IUserRepository repository) : base(repository)
{
}干杯,伊恩。
发布于 2012-02-26 02:09:19
我想我找到了..。在为IoC容器注册控制器时,检查它们是否从基类继承,如果是,则向映射中添加一些属性注入。瞧!
从那以后,我一直在思考这是不是一个糟糕的设计。是的,它节省了一些输入,并使事情看起来更简单,但它打开了一些可能显着的副作用,成为一个子类操作。也就是说,子类依赖于未通过构造函数或方法参数传入的对象。它们可能存在,也可能不存在。
发布于 2011-11-17 20:52:35
我说过不需要在派生类中复制构造函数,那么答案是否定的。您可以始终在基类中提供一个默认构造函数,该构造函数使用某种DI容器来获取IUserRepository实例。
如果您在某些时候不需要键入,您可以随时提供一个自定义的T4模板,其中包含构造函数。您可以在这里找到一个示例:http://www.hanselman.com/blog/ModifyingTheDefaultCodeGenerationscaffoldingTemplatesInASPNETMVC.aspx (虽然这主要集中在视图上,但添加控制器也是如此)。
发布于 2011-11-17 20:53:03
我知道的唯一方法是不将IUserRepository作为基类的参数传递,而是在基类中实例化它,使用:
protected readonly IUserRepository UserRepository = BindingFactory.GetInstance<IUserRepository>();其中GetInstance<T>()调用容器的Resolve() method。但这将取决于您使用的IOC类型。
https://stackoverflow.com/questions/8167330
复制相似问题