Dependency injection 如何在Unity中重写命名依赖项

Dependency injection 如何在Unity中重写命名依赖项,dependency-injection,inversion-of-control,overriding,unity-container,Dependency Injection,Inversion Of Control,Overriding,Unity Container,请建议我如何解决以下问题: 我有一门课: public class Module { public Module(Uri param1, Uri param2) { } } 此类型已在Unity容器中注册: container.RegisterInstance<Uri>("uri1", new Uri("http://sample-1.com")); container.RegisterInstance<Uri>("uri2", new Uri("ht

请建议我如何解决以下问题:

我有一门课:

public class Module
{
   public Module(Uri param1, Uri param2)
   {
   }
}
此类型已在Unity容器中注册:

container.RegisterInstance<Uri>("uri1", new Uri("http://sample-1.com"));
container.RegisterInstance<Uri>("uri2", new Uri("http://sample-2.com"));

container.RegisterType<Module>(
       new InjectionConstructor(
             new ResolvedParameter<Uri>("uri1"), 
             new ResolvedParameter<Uri>("uri2")));
container.RegisterInstance(“uri1”),新的Uri(“http://sample-1.com"));
container.RegisterInstance(“uri2”,新Uri(“http://sample-2.com"));
container.RegisterType(
新注入构造函数(
新解析参数(“uri1”),
新解析参数(“uri2”);
通过这种方式,我构建了对Uri的不同实例的不同构造函数参数的依赖关系

我希望在解析模块实例时重写此值

我可以按类型覆盖:

container.Resolve<Module>(
             new DependencyOverride(typeof(Uri), new Uri("http://overriden.com")))
container.Resolve(
新的DependencyOverride(类型化(Uri)),新的Uri(“http://overriden.com")))
我还可以通过custructor参数进行重写

container.Resolve<Module>(
   new ParameterOverride("param1", new Uri("http://param1.org"))
   new ParameterOverride("param2", new Uri("http://param2.com")))
container.Resolve(
新参数覆盖(“param1”,新Uri(“http://param1.org"))
新参数覆盖(“param2”,新Uri(“http://param2.com")))
但是:我不知道如何根据类型注册的名称按类型重写。 因此,DependencyOverride没有任何用于覆盖并非所有类型的附加参数,并且不能使用命名注册

因此,我希望有如下内容:

container.Resolve<Module>(
    new DependencyOverride("uri1", typeof(Uri), new Uri("http://overriden-1.com")),
    new DependencyOverride("uri2", typeof(Uri), new Uri("http://overriden-2.com")));
container.Resolve(
新的DependencyOverride(“uri1”、typeof(Uri)、新Uri(“http://overriden-1.com")),
新的DependencyOverride(“uri2”、typeof(Uri)、新Uri(”http://overriden-2.com")));
其中,第一个参数(uri1和uri2)是在初始注册时使用ResolvedParameter(“uri1”)和ResolvedParameter(“uri2”)注册类型时用于构建依赖项的名称

请建议我,在从容器解析模块时,如何在不定义构造函数参数名称的情况下重写

container.Resolve<Module>(
   new ParameterOverride("param1", new Uri("http://param1.org"))
   new ParameterOverride("param2", new Uri("http://param2.com")))
还有,我为什么要走这条路? 因为我不想依赖于参数的名称,所以有人可以重命名它们的依赖关系,依赖关系树将被破坏。另外,我不想依赖于模块是如何注册的,若模块有多个构造函数,那个么选择什么类型的构造函数

UPD:我找到了暂时的解决方案,但它只是一种变通方法,因为它破坏了生命周期管理器,例如PerResolveLifetimeManager,因为我们正在从控制器中分别解析模块1和模块2,它们依赖于模块1和模块2

        var m1 = _container.Resolve<IModule1>(
            new DependencyOverride(typeof(HttpControllerContext), context),
            new DependencyOverride(typeof(Uri), new Uri("http://module-1.com/")));

        var m2 = _container.Resolve<IModule2>(
            new DependencyOverride(typeof(HttpControllerContext), context),
            new DependencyOverride(typeof(Uri), new Uri("http://m-2.com/")));

        var dependency = new ResolverOverride[] 
        {
            new DependencyOverride(typeof(HttpControllerContext), context),
            new DependencyOverride(typeof(IModule1), m1),
            new DependencyOverride(typeof(IModule2), m2)
        };

        var controller = _container.Resolve(controllerType, dependency) as IHttpController;
        return controller;
var m1=\u container.Resolve(
新的DependencyOverride(类型(HttpControllerContext)、上下文),
新的DependencyOverride(类型化(Uri)),新的Uri(“http://module-1.com/")));
var m2=\u container.Resolve(
新的DependencyOverride(类型(HttpControllerContext)、上下文),
新的DependencyOverride(类型化(Uri)),新的Uri(“http://m-2.com/")));
var dependency=new ResolverOverride[]
{
新的DependencyOverride(类型(HttpControllerContext)、上下文),
新的依赖项覆盖(类型为(IModule1),m1),
新的依赖项覆盖(类型(IModule2),m2)
};
var controller=\u container.Resolve(controllerType,dependency)为IHttpController;
返回控制器;

您是否尝试了子容器?而不是

container.Resolve<Module>(
    new DependencyOverride("uri1", typeof(Uri), new Uri("http://overriden-1.com")),
    new DependencyOverride("uri2", typeof(Uri), new Uri("http://overriden-2.com")));
container.Resolve(
新的DependencyOverride(“uri1”、typeof(Uri)、新Uri(“http://overriden-1.com")),
新的DependencyOverride(“uri2”、typeof(Uri)、新Uri(”http://overriden-2.com")));
您可以使用URI创建子容器,并让它解析您的模块:

container.CreateChildContainer()
    .RegisterInstance<Uri>("uri1", new Uri("http://overriden-1.com"))
    .RegisterInstance<Uri>("uri2", new Uri("http://overriden-2.com"))
    .Resolve<Module>();
container.CreateChildContainer()
.RegisterInstance(“uri1”,新Uri(“http://overriden-1.com"))
.RegisterInstance(“uri2”,新Uri(“http://overriden-2.com"))
.Resolve();

如何更改配置中的值或“uri1”,而不是使用
ResolverOverride
的派生词?当然可以,但这不能帮助我解决如何在不依赖构造函数参数名称的情况下重写构造函数参数的问题。我只希望按类型重写。但你给我建议了另一种解决方法。如果有帮助的话,我会写下我是如何做到的回应。老实说,我甚至建议你不要在应用程序代码中的任何地方调用组合根之外的容器。。。您是否介意分享一段代码,展示如何以及在何处以上述方式调用容器?我更感兴趣的是这个代码段的位置,而不是实际的解决方法。您从哪里获得
Uri
的各种实例?我在使用DependencyOverride解析IModule1&Module2时替换了类型Uri