我有一些功能切换,我包含在使用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
的实例。
答案 0 :(得分:1)
使用Scan
功能注册实现IFeature的所有类型。这将满足您的第一需要,在诊断页面上显示一个列表。
如果服务需要特定的实现,它应该在构造函数中声明它需要的特定类型(HotNewFeature
)而不是接口(IFeature
)。您已在示例中正确完成此操作。此时,您无需在StructureMap中执行任何其他操作。如果您从StructureMap请求ServiceThatUsersFeature
,并且它依赖于具体的类(HotNewFeature
),那么StructureMap将知道如何实例化该具体类。