首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免在C#中提供基类参数

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

Stack Overflow用户
提问于 2011-11-17 20:47:05
回答 5查看 180关注 0票数 1

我有一个基类,就像这样...

代码语言:javascript
复制
public class BaseController : Controller
{
    private readonly IUserRepository userRepository;

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

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

代码语言:javascript
复制
public HomeController(IUserRepository repository) : base(repository)
{
}

干杯,伊恩。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-02-26 02:09:19

我想我找到了..。在为IoC容器注册控制器时,检查它们是否从基类继承,如果是,则向映射中添加一些属性注入。瞧!

从那以后,我一直在思考这是不是一个糟糕的设计。是的,它节省了一些输入,并使事情看起来更简单,但它打开了一些可能显着的副作用,成为一个子类操作。也就是说,子类依赖于未通过构造函数或方法参数传入的对象。它们可能存在,也可能不存在。

票数 0
EN

Stack Overflow用户

发布于 2011-11-17 20:52:35

我说过不需要在派生类中复制构造函数,那么答案是否定的。您可以始终在基类中提供一个默认构造函数,该构造函数使用某种DI容器来获取IUserRepository实例。

如果您在某些时候不需要键入,您可以随时提供一个自定义的T4模板,其中包含构造函数。您可以在这里找到一个示例:http://www.hanselman.com/blog/ModifyingTheDefaultCodeGenerationscaffoldingTemplatesInASPNETMVC.aspx (虽然这主要集中在视图上,但添加控制器也是如此)。

票数 1
EN

Stack Overflow用户

发布于 2011-11-17 20:53:03

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

代码语言:javascript
复制
protected readonly IUserRepository UserRepository = BindingFactory.GetInstance<IUserRepository>();

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8167330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档