有没有一种在StructureMap中两次注册同一对象的好方法?

时间:2013-01-09 17:54:25

标签: c# structuremap

我有一些功能切换,我包含在使用StructureMap的.NET应用程序中。我想为两个目的注册功能切换。

  • 在诊断页上显示所有 IFeatures的当前状态。
  • 在依赖于给定IFeature实现的服务构造函数中使用某些实例

这是我的设置。我想知道的是,我做得对吗?我有更好的方法吗?

class HotNewFeature : IFeature { ... }

class ServiceThatUsesFeature 
{
    public ServiceThatUsesFeature(HotNewFeature hotNewFeature) { ... }
}

// Type registry setup
For<HotNewFeature>().Singleton().Use<HotNewFeature>();
For<IFeature>().Singleton().Add(c => c.GetInstance<HotNewFeature>);
For<ServiceThatUsesFeature>().Singleton().Use<ServiceThatUsesFeature>());

// Get all instances on the diagnostics page:
IEnumerable<IFeature> features = ServiceLocator.Current.GetAllInstances<IFeature>();

我希望在诊断页面上,features在这种情况下会包含一个IEnumerable个单元素,HotNewFeature的实例。

1 个答案:

答案 0 :(得分:1)

使用Scan功能注册实现IFeature的所有类型。这将满足您的第一需要,在诊断页面上显示一个列表。

如果服务需要特定的实现,它应该在构造函数中声明它需要的特定类型(HotNewFeature)而不是接口(IFeature)。您已在示例中正确完成此操作。此时,您无需在StructureMap中执行任何其他操作。如果您从StructureMap请求ServiceThatUsersFeature,并且它依赖于具体的类(HotNewFeature),那么StructureMap将知道如何实例化该具体类。