2016-02-10 2 views
2

Вот как мое приложение делает вызов к базе данных: Web App -> Бизнес Layer -> Layer DataИспользование наследования и инъекции зависимостей в то же время

Все использует инъекции зависимостей.

Например:

В контроллере в моем веб-приложение, которое я сделать вызов, как это:

await _manager.GetCustomers(); 

Что входит в мой бизнес-слой:

public class CustomerManager : ICustomerManager 
{ 
    private ICustomerRepo _repository; 
    public CustomerManager(ICustomerRepo repository) 
    { 
     _repository = repository; 
    } 

    public Task<IList<Customer>> GetCustomers(string name = null) 
    { 
     return _repository.GetCustomers(name); 
    } 
} 

Что входит в мой уровень данных:

public class CustomerRepo : BaseRepo, ICustomerRepo 
{ 
    public CustomerRepo(IConfigurationRoot configRoot) 
    : base(configRoot) 
    { 
    } 

    public Customer Find(int id) 
    { 
     using (var connection = GetOpenConnection()) 
     { 
      ... 
     } 
    } 
} 

Фокус в том, что CustomerRepo наследует от BaseRepo, чтобы иметь возможность использовать функцию GetOpenConnection(). Но в то же время BaseRepo нуждается в IConfigurationRoot, введенном в него из веб-приложения. Как я могу сделать то и другое?

public class BaseRepo 
{ 
    private readonly IConfigurationRoot config; 

    public BaseRepo(IConfigurationRoot config) 
    { 
     this.config = config; 
    } 

    public SqlConnection GetOpenConnection(bool mars = false) 
    { 
     string cs = config.GetSection("Data:DefaultConnection:ConnectionString").ToString(); 
     ... 
    } 
} 
+0

Как выглядит конструктор 'CustomerRepo'? Требуется ли «IConfigurationRoot» и передать его базовому конструктору? –

+0

В настоящее время у меня нет конструктора в моем CustomerRepo, я думаю, что это может быть то, что мне не хватает! Я не понимаю синтаксиса, как я это сделаю. Если BaseRepo находится в объявлении класса, и конструктор объявляется после этого. Как я могу отправить его в BaseRepo в качестве параметра? Можете ли вы показать мне пример? –

+0

Имеет ли 'BaseRepo' конструктор без параметров? Скомпилируется ли 'CustomerRepo'? –

ответ

4

Как бы вы создавали экземпляр (или даже компилировали) CustomerRepo вообще, независимо от инъекции зависимостей? Вам нужно указать параметр IConfigurationRoot, чтобы перейти к базовому конструктору. Как:

public CustomerRepo(IConfigurationRoot configRoot) 
    : base(configRoot) 
{ 
} 

См https://msdn.microsoft.com/en-us/library/hfw7t1ce.aspx для информации о базовом ключевом слове.

+0

Я уверен, что это точный синтаксис, который я ищу. Мне было интересно, как передать параметр во время наследования. Так что я должен обновить свой бизнес-уровень тоже? –

+0

@BlakeRivell Вы вручную создаете «CustomerManager», передавая ему «CustomerRepo», который вы также вручную создали? Если это так, вам нужно будет предоставить 'CustomerRepo'' IConfigurationRoot' при его создании. Если вы используете контейнер IOC, где вы можете регистрировать типы, должно быть достаточно зарегистрировать ICustomerRepo и IConfigurationRoot, и контейнер сможет разрешить вам зависимости. –

+0

Я использую ASP.NET 5 и встроенную инъекцию зависимостей. Я ничего не передаю вручную. Я указываю все в своих службах регистрации в Startup.cs моего веб-приложения, которое похоже на настройку любого другого контейнера IoC. Поэтому я пытался следовать этой схеме, надеясь, что смогу получить настройки моего приложения до моего BaseRepo, все еще использую инъекцию зависимостей. Это что-то меняет? Я обновил сообщение до того, как выглядит мой класс хранилища. Мне сказали, что это делается в методе ConfigureServices, который волшебным образом будет работать: службы.AddSingleton (_ => Конфигурация); –

Смежные вопросы