2016-07-08 9 views
3

В моем основном решении asp.net у меня есть 2 проекта: приложение asp.net и библиотека с уровнем модели, который содержит репозиторий шаблонов.Инъекция ядра Core ASP.NET

Я прошу DI в приложении реализовать мой интерфейс

services.AddTransient<IRepositrory, Repository>(); 

Но! Repository конструктор имеет параметр

public Repository(string connectionString) 
{ 
    _appDBContext = new AppDBContext(connectionString); 
} 

Как правильно настроить DI, чтобы создать хранилище с определенной строкой из appsettings.json (asp.net приложения)?

+4

Ваше хранилище класс должен получить 'AppDbContext' впрыскивается как зависимость. То, что у вас есть сейчас, не является правильным дизайном DI – MikeSW

+0

общедоступный репозиторий (IDBContext dbContext), что-то вроде этого? –

+0

Да, вот так – MikeSW

ответ

4

Существует перегрузка, которая принимает реализация фабрики

services.AddTransient<IRepository>(isp => new Repository(conn)); 

Вы можете получить строку соединения с помощью

Configuration.GetConnectionString("DefaultConnection") 
3

Вы также можете использовать AddInstance метод:

var connectionString=Configuration.GetConnectionString("DefaultConnection"); 
services.AddInstance<IRepository>(new Repository(connectionString)); 

Но я «Согласен с @MikeSW, что он сказал в своем комментарии выше. Вы должны зарегистрировать свой DbContext и использовать его в качестве параметра в вашем хранилище конструктору:

services.AddDbContext<AppDBContext>(options => 
     options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 

И ваш конструктор будет:

public Repository(AppDBContext context) 
{ 
    _appDBContext = context; 
} 
0

вы должны положить свои услуги по методу ConfigureServices из Startup.cs

public Startup() 
    { 
     var builder = new ConfigurationBuilder() 
         .AddJsonFile("appsettings.json"); 
     Configuration = builder.Build(); 
    } 

    public IConfiguration Configuration { get; set; } 

    public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddMvc(); 

     services.AddEntityFramework() 
       .AddSqlServer() 
       .AddDbContext<MyDbContext>(
      options => options.UseSqlServer(Configuration["database:connection"])); 
    } 

Где appsettings.json:

{ 
"database": { 
"connection": "Data Source=(localdb)\\mssqllocaldb;Initial Catalog=MyDb" 
    } 
} 
0
services.AddTransient<IRepository>(isp => new Repository(connection)); 

Используйте это для принимает фабрику реализации и получить строку подключения используйте: -

Configuration.GetConnectionString("DefaultConnection") 
Смежные вопросы