例如,假设我有一个接口'IFeed'和两个实现此接口的具体类型('Feed1'和'Feed2')。现在让我们假设我有一个'FeedManager'类型,它具有多个可以动态解析的参数,其中两个类型是'IFeed',我希望通过构造函数注入来注入两个具体类型,而不是通过手动解析(我只在组合根处使用解析一次)。我有一种感觉,我应该使用一个工厂,但我想看看这样做的正确方法。提前谢谢了。注入(通过构造函数)实现相同接口的不同类型的正确方法是什么?
-1
A
回答
0
如果你想要所有IFeed的实现,你可以在你的构造函数中使用数组语法,然后在类型注册时不需要任何特殊的东西。
container.RegisterType<IFeedManager, FeedManager>();
container.RegisterType<IFeed, FeedA>("FeedA"); // The name doesn't matter
container.RegisterType<IFeed, FeedB>("FeedB"); // The name doesn't matter
那么管理者构造...
public FeedManager(IFeed[] feeds) {...}
,或者如果你想添加一个小火炬调用直接构造...
public FeedManager(params IFeed[] feeds) {...}
0
假设您想要在运行时确定实际的具体实例,您需要使用命名类型注册,然后告诉统一你想要哪一个。因此,使用工厂方法来构建所需的类型,并将其作为参数覆盖进行传递。 Unity将使用覆盖并解决任何剩余的依赖关系。
// register the types using named registrations
container.RegisterType<IFeedManager,FeedManager>()
container.RegisterType<IFeed, Feed1>("Feed1")
container.RegisterType<IFeed, Feed2>("Feed2")
假设你的饲料经理具有下列命名的构造函数的参数
class FeedManager : IFeedManager
{
public FeedManager (IFeed Feed1, IFeed Feed2, string someOtherDependency)
{
}
}
,并建立自己的资讯经理:
static IFeedManager CreateFeedManager()
{
ParameterOverride feed1 = new ParameterOverride("Feed1"
,_container.Resolve<IFeed>("feed1"));
ParameterOverride feed2 = new DependencyOverride("Feed2"
,_container.Resolve<IFeed>("feed2"));
IFeedManager = _container.Resolve<IFeedManager>(feed1,feed2)
return IFeedManager;
}
这显然是过于简单,但你插入自己的逻辑以确定哪个实例将被解析,然后针对FeedManager所需的每个IFeed实例注入。
0
使用Unity你可以这样做,像这样:
container.RegisterType<IFeed, Feed1>("Feed1");
container.RegisterType<IFeed, Feed2>("Feed2");
container.RegisterType<FeedManager>(new InjectionConstructor(new ResolvedParameter<IFeed>("Feed1"),
new ResolvedParameter<IFeed>("Feed2")));
现在这已配置统一,这样,当它需要解决FeedManager
,这将解决FEED1为第二个参数的第一个参数和Feed2。
相关问题
- 1. 什么是定义类构造函数的正确方法?
- 2. 什么是文件,类和构造函数的正确方法?
- 3. 实现类中的接口构造函数和方法
- 4. 在android,application context中实现构造函数的正确方法是什么?
- 5. javascript:相同类型的对象的不同构造函数
- 6. Autofac注册相同的接口,不同的构造
- 7. 使用StructureMap将相同接口的不同实现注入控制器的最佳方式是什么?
- 8. 如何注册实现相同接口的多种类型
- 9. 如何以不同的方式实现相同接口的通用方法?
- 10. 通过不同的JVM接口实现
- 11. 使用Ninject注入实现相同接口的不同类使用Ninject
- 12. 实现相同接口的接口内的内部类,我们通过这个实现了什么?
- 13. 实现java Collection接口的正确方法是什么
- 14. 为什么实现接口的类不是与Java中的接口相同的类型?
- 15. 注入多个相同类型的构造函数的参数与Ninject 2.0
- 16. 为什么C++构造函数接受不正确的类型作为参数?
- 17. 如何注册并使用相同接口的不同实现?
- 18. 在Windsor Container中注册几个相同类型的实例的正确方法是什么?
- 19. 通过反射获取接口类型的构造函数,是否有比遍历类型更好的方法?
- 20. 什么类型的java构造函数是这些?构造函数链接?
- 21. 无法实现具有不同类型参数的接口
- 22. Unity:通过其构造函数依赖解决接口实现
- 23. 什么是类型和什么是类型构造函数scala
- 24. 类实现两个接口定义相同的方法
- 25. Java类中实现相同方法签名的两个接口
- 26. 在Scala中调用超类构造函数的正确方法是什么?
- 27. 什么类型是构造函数?
- 28. Castle Windsor:注册具有相同构造函数参数的接口的所有实现
- 29. 通过调用构造函数(方法)类的明确
- 30. 通过构造函数传递什么以及通过接口传递什么?
通过自动DI工具通常做如Unity DI容器。您使用别名/名称解析该类型,并在config或其他位置指定该参数。 – Haney 2014-12-05 02:29:53
当我尝试使用别名时,我撞到了墙上,因为它似乎需要指定确切的构造函数签名;我似乎无法告诉它,一个名为'feed1'的参数应该被解析为这个,并且参数'feed2'应该被解析为...我必须填写所有参数。无论如何,我想知道这是否是适当的设计。 – Anthony 2014-12-05 02:33:45
您的问题与您接受的答案不符。也许代码示例将在未来有所帮助。 – Lukazoid 2014-12-07 17:48:56