我为服务注册了两个组件:
container.Register(
Component.For<IDataStorage>().Named("FirstChoice").ImplementedBy...
Component.For<IDataStorage>().Named("SecondChoice").ImplementedBy
然后我有一组从这个基类派生的组件,这取决于这些组件:
public abstract class BaseMessageHandler
{
public IDataStorage FirstStorage {get; set;}
public IDataStorage SecondStorage {get; set;}
}
如果我手动注册这些“处理程序”(从 BaseMessageHandler 派生),我将指定一个服务覆盖,指示我想要属性“FirstStorage”和“SecondStorage”的哪个组件。就像是:
.Configure(x => x.DependsOn(
ServiceOverride.ForKey("FirstStorage").Eq("FirstChoice"),
ServiceOverride.ForKey("SecondStorage").Eq("SecondChoice"))
不幸的是,这种注册是由框架(NServiceBus)自动完成的。我知道,如果我首先注册处理程序(在 NServiceBus 有机会这样做之前),这些注册将会保留。但与其尝试猜测和模仿 NServiceBus 所做的注册,我想知道是否可以在自定义 IContributeComponentModelConstruction 中指定服务覆盖。这似乎是一个很好的地方,我能够找到这些属性:
public class DataStorageOverrideContributor : IContributeComponentModelConstruction
{
public void ProcessModel(Castle.MicroKernel.IKernel kernel, Castle.Core.ComponentModel model)
{
var dataStorageDependencies = model.Properties.Where(
x => x.Dependency.TargetItemType == typeof(IDataStorage));
foreach (var propertyDependency in dataStorageDependencies)
{
// now what??
但我不确定正确的方法:
- 检查是否已经指定了服务覆盖(在这种情况下我什么都不做)
- 将服务覆盖添加到属性依赖项。
这是可以在 IContributeComponentModelConstruction.ProcessModel 方法中检查和工作 ComponentModel 的事情吗?