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"))));