绑定:将相同的接口绑定到两个实现

本文关键字:绑定 实现 两个 接口 | 更新日期: 2023-09-27 17:52:42

我有一个名为Infrastructure的项目,它包含一个接口IRepository

public interface IRepository<T>
{
    /// <summary>
    /// Adds the specified entity to the respository of type T.
    /// </summary>
    /// <param name="entity">The entity to add.</param>
    void Add(T entity);
    /// <summary>
    /// Deletes the specified entity to the respository of type T.
    /// </summary>
    /// <param name="entity">The entity to delete.</param>
    void Delete(T entity);
}

在我的解决方案中,我有另外两个项目

  • 应用程序。Web
  • Application.Web.Api
  • 基础设施

两个项目,包含IRepository接口的实现

public class EFRepository<T> : IRepository<T>
{
    // DbContext for Application.Web project
    ApplicationWebDbContext _db;
    public EFRepository(ApplicationWebDbContext context)
    {
        _db = context;
    }
    public void Add(T entity) { }
    public void Delete(T entity) { }
}
public class EFRepository<T> : IRepository<T>
{
    // DbContext for Application.Web.Api project
    ApplicationWebAPIDbContext _db;
    public EFRepository(ApplicationWebAPIDbContext context)
    {
        _db = context;
    }
    public void Add(T entity) { }
    public void Delete(T entity) { }
}

两种实现都适用于不同的DataContexts

如何在ject中绑定这个?

private static void RegisterServices(IKernel kernel)
{
    // bind IRepository for `Application.Web` project
    kernel.Bind(typeof(IRepository<>)).To(typeof(Application.Web.EFRepository<>));
    // bind IRepository for `Application.Web.Api' project
    kernel.Bind(typeof(IRepository<>)).To(typeof(Application.Web.Api.EFRepository<>));    
}

绑定:将相同的接口绑定到两个实现

几种方法来解决这种情况

命名绑定

最简单,只需提供依赖项的名称:

kernel
        .Bind(typeof(IRepository<>))
        .To(typeof(WebApiEFRepository<>))
        // named binding
        .Named("WebApiEFRepository");

并使用此名称解析它。名称可以在配置:web.config中找到,例如:

var webApiEFRepository = kernel.Get<IRepository<Entity>>("WebApiEFRepository");
<<h3>上下文绑定/h3>

从注入上下文查找要绑定的类型。在您的示例中,基于目标命名空间

kernel
    .Bind(typeof(IRepository<>))
    .To(typeof(WebDbRepository<>))
    // using thins binding when injected into special namespace
    .When(request => request.Target.Type.Namespace.StartsWith("Application.Web"));

从内核获取依赖项:

// WebDbRepository<> will be injected
var serice = kernel.Get<Application.Web.Service>();