1

私は次の構成を持っています:

For<ITranslatorProvider>().Singleton().Use<TranslatorProviderA>();

私には3つの翻訳者プロバイダーがあります:TranslatorProviderA、B、C。

それぞれが特定の名前空間で使用される必要があります。

Project.Services>プロバイダーAを使用

Project.Site>ユーザープロバイダーB

..。

リクエストが送信された名前空間に応じて、プロバイダーA、B、またはCを挿入できますか?

これは可能ですか?

4

2 に答える 2

1

規則を使用してそれを行うことができるはずです。このようなものが機能するはずです:

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>();
    })
);
于 2013-03-27T08:47:00.113 に答える
0

名前空間に基づいてプロバイダーを注入できるとは思いません。ただし、名前付きインスタンスを使用することで、同じことを実現できます(実装を理解している場合)。

For<ITranslatorProvider>().Add<TranslatorProviderA>().Named("NS1");
For<ITranslatorProvider>().Add<TranslatorProviderB>().Named("NS2");

次に使用します:

container.GetInstance<ITranslatorProvider>("NS1");
于 2013-03-25T23:03:59.217 に答える