1

私は3つのプロジェクトを持っています:

Core(リポジトリ、サービスなどのドメイン モデルとインターフェイスが含まれています) (
Repositoryリポジトリの具体的な実装)
Web(MVC 4 プロジェクト)。

ObjectFactory.Initialize の内部には、次のようなものがあります。

For<IFooRepository>().Use<FooRepository>();
For<IBooRepository>().Use<BooRepository>();
...

50 個のリポジトリがあるとしましょう。これは、50 行のコード (具体的な実装ごとに 1 行) を書かなければならないということですか? インターフェイスが要求されたときに、インターフェイスを実装し、そのクラスをインスタンス化するStructureMapことをどうにかして理解できますか?FooRepositoryIFooRepositorIFooRepository

どんな助けでも大歓迎です!

4

1 に答える 1

3

StructureMap を使用すると、アセンブリをスキャンし、インターフェイスを型に接続する規則を適用することで、プログラムでこれを行うことができます。次に例を示します。

public class RepositoryRegistry : StructureMap.Configuration.DSL.Registry
{
    public RepositoryRegistry()
    {
        Scan(s =>
        {
            s.AssemblyContainingType<ApplicationRepository>();
            s.Convention<TypeNamingConvention>();
        });
    }
}

と:

public class TypeNamingConvention : IRegistrationConvention
{
    public void Process(Type type, Registry registry)
    {
        Type interfaceType = type.GetInterfaces()
            .ToList()
            .Where(t => t.Name.ToLowerInvariant().Contains("i" + type.Name.ToLowerInvariant()))
            .FirstOrDefault();

        if (interfaceType != null)
        {
            registry.AddType(interfaceType, type);
        }
    }
}   

そして、次のように初期化時にレジストリを呼び出します。

ObjectFactory.Initialize(x => x.Scan(s =>
{
 s.TheCallingAssembly();
 s.LookForRegistries();
}));

この規則は、タイプがインターフェイス + "I" に一致するという標準を前提としています。うまくいけば、それで十分に続けることができます。

于 2012-08-21T14:59:28.037 に答える