我得到了这样的基类......
public class BaseController : Controller
{
private readonly IUserRepository userRepository;
public BaseController(IUserRepository userRepository)
{
this.userRepository = userRepository;
}
}
我希望我的所有MVC控制器都继承自这个类。有什么方法可以避免从这样的每个子类构造函数向基类提供'userRepository'实例吗?
public HomeController(IUserRepository repository) : base(repository)
{
}
干杯,伊恩。
答案 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容器注册控制器时,检查它们是否继承自基类,然后如果是这样,则为映射添加一些属性注入。瞧!
我已经考虑过这是不是一个糟糕的设计。是的,它节省了一些打字并使看起来更简单,但它为子类操作开辟了一些可能很重要的副作用。即,子类依赖于未通过构造函数或通过方法参数来的对象。他们可能会或可能不会在那里。