規則を使用してそれを行うことができるはずです。このようなものが機能するはずです:
using System;
using System.Linq;
using StructureMap.Configuration.DSL;
using StructureMap.Graph;
using StructureMap.TypeRules;
class TranslationConvention : IRegistrationConvention
{
public void Process(Type type, Registry registry)
{
if(!type.IsConcrete())
return;
var ctor = Constructor.GetGreediestConstructor(type);
var translatorParameters= ctor.GetParameters()
.Where(p => typeof(ITranslatorProvider)
.IsAssignableFrom(p.ParameterType));
if(!translatorParameters.Any())
return;
Type translatorType = GetTranslatorType(type);
translationParameters.Aggregate(registry.For(type).Use(type),
(current, parameter) =>
current.CtorDependency<ITranslatorProvider>(parameter.Name)
.IsConcreteType(translatorType));
}
Type GetTranslatorType(Type type)
{
if(type.Namespace == "Project.Services")
return typeof(TranslatorProviderA);
if(type.Namespace == "Project.Site")
return typeof(TranslatorProviderB);
return typeof(TranslatorProviderC);
}
}
registry.For(type).Use(type)
上記の規則は、具象型を登録する場合にのみ機能するため、規則でクラスをインターフェイスにバインドする場合は、この部分をより適切なものに変更する必要があります。いくつかのアイデアについては、StructureMapに組み込まれている規則を参照してください。
スキャンで規則を使用できます。
ObjectFactory.Initialize(c => c.Scan(s =>
{
s.TheCallingAssembly();
s.Convention<TranslationConvention>();
})
);