Многоцелевая реализация ASP.NET для внедрения зависимостей - PullRequest
0 голосов
/ 27 апреля 2019

Есть ли способ обозначить несколько реализаций одного интерфейса с использованием ASP.NET Core? Я мог бы сделать это в Ninject так:

ninjectKernel.Bind<DbContext>().To<OracleDbContext>().Named("UnitWork");
ninjectKernel.Bind<DbContext>().To<AppsDbContext>().Named("AppsWork");

Ответы [ 2 ]

1 голос
/ 28 апреля 2019

Если ваш вопрос относится только к DbContext, тогда легко использовать следующие операторы

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<OracleDbContext>(builder => builder.UseSqlServer(connectionString));
    services.AddDbContext<AppsDbContext>(builder => builder.UseSqlServer(connectionString));
}

Если ваш вопрос относится к общим интерфейсам, то это возможно, только если это общий интерфейс.Допустим, у вас есть интерфейс, подобный приведенному ниже:

public interface IRepository<T>
{
}

и несколько реализаций, таких как:

public class GenericRepository<User> : IRepository<User>
{
}

public class GenericRepository<Order> : IRepository<Order>
{
}

Для регистрации нескольких реализаций вам нужна только одна строка.

public void ConfigureServices(IServiceCollection services)
{
    // you can register them with any life time like that e.g. Singleton, Transient
    services.AddScoped(typeof(IRepository<>), typeof(GenericRepository<>));
}

Надеюсь, это поможет

0 голосов
/ 30 июня 2019

Я также обнаружил, что вы можете настроить OracleDbContext (s) следующим образом в Configure Services:

services.AddEntityFrameworkOracle()
  .AddDbContext<OracleDbContext>(option => option.UseOracle(Configuration["Data:OracleDbConnection"]), ServiceLifetime.Scoped)
  .AddDbContext<AppsDbContext>(option => option.UseOracle(Configuration["Data:AppsbConnection"]), ServiceLifetime.Scoped);
...