2014-12-05 80 views
-1

例如,假设我有一个接口'IFeed'和两个实现此接口的具体类型('Feed1'和'Feed2')。现在让我们假设我有一个'FeedManager'类型,它具有多个可以动态解析的参数,其中两个类型是'IFeed',我希望通过构造函数注入来注入两个具体类型,而不是通过手动解析(我只在组合根处使用解析一次)。我有一种感觉,我应该使用一个工厂,但我想看看这样做的正确方法。提前谢谢了。注入(通过构造函数)实现相同接口的不同类型的正确方法是什么?

+0

通过自动DI工具通常做如Unity DI容器。您使用别名/名称解析该类型,并在config或其他位置指定该参数。 – Haney 2014-12-05 02:29:53

+0

当我尝试使用别名时,我撞到了墙上,因为它似乎需要指定确切的构造函数签名;我似乎无法告诉它,一个名为'feed1'的参数应该被解析为这个,并且参数'feed2'应该被解析为...我必须填写所有参数。无论如何,我想知道这是否是适当的设计。 – Anthony 2014-12-05 02:33:45

+0

您的问题与您接受的答案不符。也许代码示例将在未来有所帮助。 – Lukazoid 2014-12-07 17:48:56

回答

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。

相关问题