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

C# 避免在C语言中提供基类参数#,c#,.net,asp.net-mvc,C#,.net,Asp.net Mvc,我有一个像这样的基类 public class BaseController : Controller { private readonly IUserRepository userRepository; public BaseController(IUserRepository userRepository) { this.userRepository = userRepository; } } 我希望我的所有MVC控制器都从这个类继承。是否

我有一个像这样的基类

public class BaseController : Controller
{
    private readonly IUserRepository userRepository;

    public BaseController(IUserRepository userRepository)
    {
        this.userRepository = userRepository;
    }
}
我希望我的所有MVC控制器都从这个类继承。是否有某种方法可以避免像这样从每个子类构造函数向基类提供“userRepository”实例

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

干杯,Ian。

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


如果您有时间键入,您总是可以提供一个自定义T4模板,其中包含构造函数。您可以在这里找到一个示例:(虽然这主要集中在视图上,但添加控制器也是如此)。

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


如果您有时间键入,您总是可以提供一个自定义T4模板,其中包含构造函数。您可以在这里找到一个示例:(虽然这主要集中在视图上,但添加控制器也是如此)。

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

protected readonly IUserRepository UserRepository = BindingFactory.GetInstance<IUserRepository>();
受保护的只读IUserRepository UserRepository=BindingFactory.GetInstance();

其中
GetInstance()
调用容器的
Resolve()方法。但这取决于您使用的IOC类型。

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

protected readonly IUserRepository UserRepository = BindingFactory.GetInstance<IUserRepository>();
受保护的只读IUserRepository UserRepository=BindingFactory.GetInstance();

其中
GetInstance()
调用容器的
Resolve()方法。但这取决于您使用的IOC类型。

您可以创建一个自定义的控制器工厂,并在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);
    }

}
如果使用依赖项注入,这也很有用

更多信息:


您可以创建一个自定义的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);
    }

}
如果使用依赖项注入,这也很有用

更多信息:


您可以使用从BaseController继承的一些包装类,并将一些(什么?)对象放入userRepository

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

您可以使用从BaseController继承的一些包装类,并将一些(什么?)对象放入userRepository

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

我想我明白了。。。注册IoC容器的控件时,请检查它们是否从基类继承,如果是,请向映射添加一些属性注入。瞧


我一直在思考这是否是一个糟糕的设计。是的,它节省了一些输入,使事情看起来更简单,但它在子类操作中打开了一些可能重要的副作用。i、 e.子类依赖于未通过构造函数或方法参数来的对象。他们可能在那里,也可能不在那里。

我想我知道了。。。注册IoC容器的控件时,请检查它们是否从基类继承,如果是,请向映射添加一些属性注入。瞧


我一直在思考这是否是一个糟糕的设计。是的,它节省了一些输入,使事情看起来更简单,但它在子类操作中打开了一些可能重要的副作用。i、 e.子类依赖于未通过构造函数或方法参数来的对象。它们可能在那里,也可能不在那里。

你想让它在子类中可见吗?不要声明
HomeController
,如果子类的构造函数中没有代码,那么
BaseController
将被调用。我很惊讶这是不可能的。由于基类没有0参数构造函数,您必须提供一个调用基类构造函数的构造函数。有一种方法!具有分配给基本控制器上的属性的筛选器。这需要属性注入,这让我想知道是否可以直接在基本控制器上进行属性注入。到目前为止,我还没有让它工作。你想让它在子类中可见吗?不要声明
HomeController
,如果子类的构造函数中没有代码,那么将调用
BaseController
。我很惊讶这是不可能的。由于基类没有0参数构造函数,您必须提供一个调用基类构造函数的构造函数。有一种方法!具有分配给基本控制器上的属性的筛选器。这需要属性注入,这让我想知道是否可以直接在基本控制器上进行属性注入。到目前为止,我还没有让它工作。这是行不通的,因为我不想只返回一种类型的控制器!这是行不通的,因为我不想只返回一种类型的控制器!这个例子行不通。您将得到一个编译错误,如:
“'BaseController'不包含接受0个参数的构造函数”
。此示例不起作用。您将得到一个编译错误,如:
“'BaseController'不包含接受0个参数的构造函数”