C# unity创建特定实例

C# unity创建特定实例,c#,asp.net,asp.net-mvc,dependency-injection,unity-container,C#,Asp.net,Asp.net Mvc,Dependency Injection,Unity Container,我目前正在使用.NET4.6、MVC5和Unity4构建一个应用程序。我有一个控制器,如下所示: public class ExamController: Controller { private IEducationService _eduService; public ExamController(IEducationService eduService) { _eduService = eduService; } } Unity为服务注入了以下内容: container

我目前正在使用.NET4.6、MVC5和Unity4构建一个应用程序。我有一个控制器,如下所示:

public class ExamController: Controller {
 private IEducationService _eduService;    
 public ExamController(IEducationService eduService) {
  _eduService = eduService;
 }
}
Unity为服务注入了以下内容:

container.RegisterType<IEducationService, EducationService>();
问题是,我不希望这两种方法一直都可用,它们应该基于调用的操作方法而可用。我可以为每个构造函数创建单独的构造函数,但我不确定如何使Unity生成一个而不是两个构造函数,基于调用的动作方法。

使用

此外,创建未使用的额外对象的担忧是错误的(当然,除非您违反了此规则)。当构造函数中只有赋值语句时,创建对象是非常便宜的,因此注入1个甚至100个以上的对象可能不会对性能产生巨大影响

您还应该限制控制器拥有的服务数量。如果你有3个或4个以上,那么你可能违反了单一责任原则,并且每个人都应该承担单一责任。结果是,您将有一个更像金字塔的对象图,顶部有几个依赖项,这些依赖项将每个都有几个依赖项,直到您到达没有依赖项的底部


相关:

您可以使用ServiceLocator在需要的地方简单地在action方法中解析依赖项,而不是将依赖项注入整个类并使其可用:

var expService = ServiceLocator.Current.GetInstance(typeof(IExperienceService));
ServiceLocator.SetLocatorProvider(() => new UnityServiceLocator(container));
您首先需要注册Unity的ServiceLocator:

var expService = ServiceLocator.Current.GetInstance(typeof(IExperienceService));
ServiceLocator.SetLocatorProvider(() => new UnityServiceLocator(container));


请注意:服务定位器模式被认为是反模式。

为什么建议使用反模式?Ctor注入是一种方式,因为它明确说明了这个类依赖于什么。+1。如果你真的担心ctor参数列表的长度会比其他地方的长。您的控制器可能有多个职责。