MVC 5 / UnityConfig - тот же интерфейс - несколько реализаций - PullRequest
0 голосов
/ 12 февраля 2020

Итак, у меня есть этот базовый c Интерфейс:

public interface ISearchable
{
    List<AutocompleteResult> Search(string term);
}

И два класса, которые реализуют этот интерфейс:

Первый класс:

public class LandlordReader :ISearchable
{
    public List<AutocompleteResult> Search(string term)
    {
        ....
    }
}

Второй класс :

public class CityReader : ISearchable
{
    public List<AutocompleteResult> Search(string term)
    {
       ....
    }
}

С этого момента я нахожусь в темноте ... В UnityConfig.cs я пытался зарегистрировать их, дав им имя:

public static void RegisterTypes(IUnityContainer container)
{
    container.RegisterType<ISearchable, CityReader>("City");
    container.RegisterType<ISearchable, LandlordReader>("Landlord");
}

В MVC контроллере я понятия не имею, что указать (В КОНСТРУКТОРЕ) - чтобы сказать ему, что я хочу того или другого:

public LandlordController(ISearchable searcher)
{
    // I want the LandlordReader here, but in the CityController, I want the CityReader....
    this.searcher = searcher;
}

Я довольно нуб, Что касается DI и UnityInjector, так что полный рабочий пример был бы хорош. До этого момента я получал множество советов (используйте обобщенный c интерфейс, используйте фабрику единиц) - но пробовал их сам, ни один не работал.

Я знаю, что в ASP. NET Ядро есть атрибут Вы можете напрямую указать в списке параметров конструктора, но в настоящее время я работаю в MVC5.

Спасибо. Закончил длинный пост. Уф.

1 Ответ

1 голос
/ 12 февраля 2020

Вы можете попробовать один из этих вариантов, если это подходит для вашего сценария.

1

Использование именного Serivce Injection

public static void RegisterTypes(IUnityContainer container)
{
    container.RegisterType<ISearchable, CityReader>("City");
    container.RegisterType<ISearchable, LandlordReader>("Landlord");
}

public LandlordController([Dependency("Landlord")]ISearchable searcher)
{
    this.searcher = searcher;
}

2

public interface ISearchable<T> where T : class
{
//..............
}

public class LandlordReader : ISearchable<LandlordReader>
{
    public List<AutocompleteResult> Search(string term)
    {
        ....
    }
}

public class CityReader : ISearchable<CityReader>
{
    public List<AutocompleteResult> Search(string term)
    {
       ....
    }
}
public static void RegisterTypes(IUnityContainer container)
{
        container.RegisterType<ISearchable, CityReader>("City");
        container.RegisterType<ISearchable, LandlordReader>("Landlord");
}

и затем при использовании в конструкторе сделать это

    private readonly ISearchable<CityReader> _cityReadersearcher;
    private readonly ISearchable<LandlordReader> _landLordsearcher;
    public LandlordController(ISearchable<CityReader> cityReadersearcher, 
     ISearchable<LandlordReader> landLordsearcher)
    {
         _cityReadersearcher= _cityReadersearcher;
        _landLordsearcher = landLordsearcher;
    }
...