1

フレームワークのIOCオプションとしてSimpleInjector IOCフレームワークも使用するようにSharpRepositoryプロジェクトを構成しようとしていますが、コードの一部を移植することに行き詰まっています。SimpleInjector を使用して <> ジェネリック インターフェイスを渡す方法がわかりません。

2番目の問題/質問は、単純なインジェクターを使用してコンテキストに渡される汎用引数を取得する方法です。

public static void BindSharpRepository(this IKernel kernel, 
    ISharpRepositoryConfiguration configuration)
{
    kernel.Bind(typeof (IRepository<>)).ToMethod(context =>
    {
        var genericArgs = context.Request.Service.GetGenericArguments();
        return RepositoryFactory.GetInstance(genericArgs[0], configuration);
    });

    kernel.Bind(typeof(IRepository<,>)).ToMethod(context =>
    {
        var genericArgs = context.Request.Service.GetGenericArguments();
        return RepositoryFactory.GetInstance(genericArgs[0], 
            genericArgs[1], configuration);
    });

    kernel.Bind(typeof(ICompoundKeyRepository<,,>)).ToMethod(context =>
    {
        var genericArgs = context.Request.Service.GetGenericArguments();
        return RepositoryFactory.GetInstance(genericArgs[0], genericArgs[1], 
            genericArgs[2], configuration);
    });
}
4

1 に答える 1

1

Simple Injector で最も近いものは次のとおりです。

 container.ResolveUnregisteredType += (s, e) =>
 {
      Type type = e.UnregisteredServiceType;
      if (type.IsGenericType && 
          type.GetGenericTypeDefinition() == typeof(IRepository<>))
      {
           var args = type.GetGenericArguments();

           e.Register(() => RepositoryFactory.GetInstance(args[0], configuration));
      }
 };

別のオプションは、リポジトリの作成をRepositoryFactoryクラスの外に移動することです (可能な場合)。その場合、次のように登録を簡素化できるため、はるかに簡単になります。

// using SimpleInjector.Extensions;
container.RegisterOpenGeneric(typeof(IRepository<>), typeof(GenericRepository<>));
container.RegisterOpenGeneric(typeof(IRepository<,>), typeof(GenericRepository<,>));
container.RegisterOpenGeneric(typeof(ICompoundKeyRepository<,,>), 
    typeof(GenericCompoundKeyRepository<,,>));
于 2013-12-23T06:27:44.460 に答える