Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.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# 使用具有多个依赖项的unity容器解析不同实例_C#_Unity Container_Ioc Container - Fatal编程技术网

C# 使用具有多个依赖项的unity容器解析不同实例

C# 使用具有多个依赖项的unity容器解析不同实例,c#,unity-container,ioc-container,C#,Unity Container,Ioc Container,我想用同一个接口解析不同的实例。我读了一些关于命名注册的文章,这些文章可能会把我推向正确的方向,但我似乎无法将它们放在层次结构中 public interface IServiceType { } public interface IServiceDependancy { } public class main { var container = new UnityContainer(); container.RegisterType(typeof(IServiceType),

我想用同一个接口解析不同的实例。我读了一些关于命名注册的文章,这些文章可能会把我推向正确的方向,但我似乎无法将它们放在层次结构中

public interface IServiceType
{

}

public interface IServiceDependancy
{

}

public class main
{
  var container = new UnityContainer();
  container.RegisterType(typeof(IServiceType), typeof(ServiceType));
  container.RegisterType(typeof(IServiceDependancy), typeof(ProductionServiceDependancy), "Production");
  container.RegisterType(typeof(IServiceDependancy), typeof(TestServiceDependancy), "Test");
}
如何解析IServiceType两次(或更多)

  • 第一次使用我的TestServiceDependence
  • 第二次使用我的ProductionServiceDependance

亲切问候

在我看来,您不需要记名注册。由于您谈论的是
ProductionServiceDependency
TestServiceDependency
,因此您通常只想注册其中一个,并且只在应用程序重新启动时使用另一个(因为配置设置不同)。换句话说,您可以简单地执行以下操作:

if (ConfigurationManager.AppSettings["IsTest"] != string.Empty) {
   container.RegisterType(typeof(IServiceDependency), typeof(TestServiceDependancy));
else
   container.RegisterType(typeof(IServiceDependency), typeof(ProductionServiceDependency));
或者简单地说:

container.RegisterType(typeof(IServiceDependency),
    ConfigurationManager.AppSettings["IsTest"] != string.Empty
        ? typeof(TestServiceDependency)
        : typeof(ProductionServiceDependency));
如果您需要能够基于某些运行时条件交换实现(可能是因为您需要能够在运行时更改配置),则应将这两个实现隐藏在代理后面:

 public sealed class ServiceDependencySelectionProxy : IServiceDependency {
      private Func<bool> selectionPredicate;
      private IServiceDependency trueService;
      private IServiceDependency falseService;

      public ServiceDependencySelectionProxy(Func<bool> selectionPredicate,
          IServiceDependency trueService, IServiceDependency falseService) {
          this.selectionPredicate = selectionPredicate;
          this.trueService = trueService;
          this.falseService = falseService;
      }

      object IServiceDependency.ItsMethod(object param) {
          return this.selectionPredicate()
              ? this.trueService.ItsMethod(param)
              : this.falseService.ItsMethod(param);
      }
 }

没有选择。这是一个在不同环境之间同步用户的项目。因此,首先在synchronized en中进行生产,然后相同的服务代码应与不同的数据库依赖项一起使用。在这种情况下,代理仍然有效还是首选其他解决方案?@LuukKrijnen:这似乎是一个运行时决策,在这种情况下,代理可能是最好的方法。请记住一件事:在解析对象图时不要做出运行时决策。
container.RegisterType<IServiceDependancy, ProductionServiceDependancy>("Production");
container.RegisterType<IServiceDependancy, TestServiceDependancy>("Test");
container.Register<IServiceDependency>(new InjectionFactory(c =>
    new ServiceDependencySelectionProxy(
        () => IsApplicationTestSwitchEnabled(),
        container.Resolve<IServiceDependency>("Test"),
        container.Resolve<IServiceDependency>("Production"))));