1

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

  • アプリケーション.インフラストラクチャ
  • Application.A ( からの参照がありますApplication.Infrastructure)
  • Application.B ( からの参照がありますApplication.Infrastructure)
  • Application.Web (すべてからの参照があります)

私にはApplication.Infrastructure汎用リポジトリクラスがあります

public interface IRepository<T>
{
    T FirstOrDefault(Expression<Func<T, bool>> where);
}

私はこのApplication.Aリポジトリの実装を持っています

public class ApplicationARepository<T> : IRepository<T>
{
    private readonly IApplicationADBContext _context;
    public ApplicationARepository(IApplicationADBContext context)
    {
        _context = context;
    }
    // implementation
}

私にApplication.Bは、リポジトリインターフェースの別の実装があります

public class ApplicationBRepository<T> : IRepository<T>
{
    private readonly IApplicationBDBContext _context;
    public ApplicationBRepository(IApplicationBDBContext context)
    {
        _context = context;
    }
    // implementation
}

Application.Web では、Ninject を使用してインターフェイスをバインドします

// Bind implementations from Application.A
kernel.Bind<IApplicationADBContext>().To<ApplicationADBContext>().InRequestScope();
kernel.Bind(typeof(IRepository<>)).To(typeof(ApplicationARepository<>));

// Bind implementations from Application.B
kernel.Bind<IApplicationBDBContext>().To<ApplicationBDBContext>().InRequestScope();

// Here should fail. I already binded typeof(IRepository<>) to typeof(ApplicationARepository<>)
kernel.Bind(typeof(IRepository<>)).To(typeof(ApplicationBRepository<>));

.Where() 句を指定せずに、同じインターフェイスを 2 つの異なる型にバインドしても、動作しており、エラーは発生しません。

なんで?Ninject はどのようにそれらを区別する方法を知っているのでしょうか?

4

1 に答える 1

0

複数の実装を単一のインターフェースにバインドすることは絶対に正しいです。次に、Ninject にそれらを として注入させることができますIEnumerable。1 つの実装を複数回バインドすることもできます。

例えば:

// binding
kernel.Bind<IService>().To<BasicService>();
kernel.Bind<IService>().To<BasicService>();

// injection
private IEnumerable<IService> myServices;

public NeedServices(IEnumerable<IService> myServices)
{
     this.myServices = myServices;
}

そして、 への 2 つの参照のコレクションを取得しますBasicService

エラーが発生するのは、単一の実装を注入しようとした場合です。Ninject が依存関係を解決しようとすると、エラーが発生します (そして、Ninject はどの実装を選択すればよいかわかりません)。

public NeedService(IService myService)
{
     this.myService = myService;
}

したがって、Ninject はバインド時に依存関係を解決できるかどうかをチェックせず、インジェクションが発生する必要があるときに解決します。

ある種のContextual-Bindingの条件は時間の経過とともに変化する可能性があるため (たとえば、.When(x=> ItIsRightTimeToInjectAImplementation()).

于 2013-01-16T13:03:51.833 に答える