2017-09-27 151 views
0

如果有两个类Class1Class2,它们都实现接口IInterface在结构图中使用与forSingletonOf一起使用

现在,如果我需要每个这些类的单例实例,这是否是实现它的正确方法?

c.ForSingletonOf<IInterface>().Use<Class1>().Named("Class1"); 
c.ForSingletonOf<IInterface>().Add<Class2>().Named("Class2"); 

,然后让这样的实例:

container.GetInstance<IInterface>("Class1"); 
container.GetInstance<IInterface>("Class2"); 

有什么不对的这种做法还是有更好的方法?

回答

0

如果您想要访问IInterface的特定实现,您将需要访问容器以请求特定的命名实例。 构造函数注入将始终为您提供Class1,因为您已经告诉构造图用于IInterface。所以这可能会导致你通过容器,这是一个非常糟糕的主意。

如果需要将对象创建为单例,我建议不要注入为IInterface,而是注入Class1和Class2。他们是您的申请中的一等公民,并有资格直接访问。

c.ForSingletonOf<Class1>().Use<Class1>(); 
c.ForSingletonOf<Class2>().Use<Class2>(); 

根据您阅读的博客,您可能需要指定Class1和Class2的实现作为接口,归因于它们提供的目的。这样,如果IClass1或IClass2的支持单例应该改变,你将来可以证明它们。

public interface IClass1 : IInterface { } 
public interface IClass2 : IInterface { } 

----- 

c.ForSingletonOf<IClass1>().Use<Class1>(); 
c.ForSingletonOf<IClass2>().Use<Class2>(); 

这就是我将如何去做。我已经找到的容器中的命名实例仅在配置容器时有用,因为我可以访问它。当涉及到依赖注入时,它们不是有用的,因为您需要的命名实例由类/接口名称指定。如果您需要多个相同接口的实施,则他们有资格获得他们自己的接口imo