Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# BaseController的重载构造函数未被执行?_C#_Dependency Injection_Repository_Unit Of Work_Asp.net Mvc 5 - Fatal编程技术网

C# BaseController的重载构造函数未被执行?

C# BaseController的重载构造函数未被执行?,c#,dependency-injection,repository,unit-of-work,asp.net-mvc-5,C#,Dependency Injection,Repository,Unit Of Work,Asp.net Mvc 5,当我在基地发送服务时,我可以从中获取数据。但是,我不想从每个控制器向BaseController发送一些服务,比如AboutController,并编写太多代码 public class BaseController : Controller { [Inject] public IUnitOfWork UnitOfWork { get; set; } private readonly ISomeService _someService ; public Base

当我在基地发送服务时,我可以从中获取数据。但是,我不想从每个控制器向BaseController发送一些服务,比如AboutController,并编写太多代码

public class BaseController : Controller
{
    [Inject]
    public IUnitOfWork UnitOfWork { get; set; }
    private readonly ISomeService _someService ;

    public BaseController(ISomeService someService)
    {
        _someService = someService;
    }

    public void Contacts()
    {
        contacts = _someService .GetById(1);
        ViewBag.someThing = contacts; //Add whatever
    }

    public BaseController()
    {

    }
}

因此,在AboutController视图中,我仍然希望在不向BaseController发送参数的情况下获取某些服务的数据

如果要从基本控制器使用ISomeService,则必须通过基本构造函数传递该服务,如下所示:

public class HomeController : BaseController
{

    private readonly ISomeService someService;

    public HomeController(ISomeService someService) : base(someService)
    {
        _someService = someService;
    }
}

public class AboutController : BaseController
{
    private readonly IAboutService _aboutService;
    public AboutController (IAboutService aboutService) 
    {
        _aboutService = aboutService;
    }
}
如果您不想使用该服务,请像这样使用默认的基本构造函数,否则,如果您尝试访问它,它将为null:

public class AboutController : BaseController
{
     private readonly IAboutService _aboutService;
     public AboutController (IAboutService aboutService, ISomeService someService)  : base(someService)
     {
         _aboutService = aboutService;
     }
}
您处于第一个场景中,因此需要将其通过构造函数进行初始化

但是,如果您想打破这种模式,您可以选择将服务注入基本控制器的其他方式:

第一个是使用自动属性:

例如:

public class AboutController : BaseController
{
   private readonly IAboutService _aboutService;
   public AboutController (IAboutService aboutService)  : base()
   {
       _aboutService = aboutService;
    }
}
另一种方法是通过使用DependecyResolver获取服务实例,但这会以某种方式“破坏”DI模式,并使测试等变得更加困难。但如果您选择这样做,下面是代码:

public ISomeService SomeService { get; set;}

有关更多信息,请参阅此问题

非常感谢您,我使用DependecyResolver完成了这项工作,它现在适合我。但我仍然没有得到用括号括住DI模式的部分。我选择DependencyResolver是为了减少代码,因为我会有太多的控制器,所以我不会将Someservice作为每个控制器的参数发送。在DI中,它通常被认为是反模式的,但在您的情况下,我认为是最好的选择。如果你认为这是一个正确的答案,请考虑把它标记为这样。谢谢:
  public class BaseController : Controller
  {
     [Inject]
     public IUnitOfWork UnitOfWork { get; set; }
     private readonly ISomeService _someService ;

     public BaseController(ISomeService someService)
     {
         _someService = someService;
     }

     public void Contacts()
     {
         contacts = _someService .GetById(1);
         ViewBag.someThing = contacts; //Add whatever
     }

     public BaseController()
     {
          _someService = DependencyResolver.Current.GetService<ISomeService >();
     }
}