2016-03-24 5 views
2

Я планирую написать общий файл между тем, который может использоваться между несколькими проектами.Зависимость Инъекция, когда конкретный класс должен быть заменен C#

Мои проекты:

  1. Написать код, чтобы съесть мороженое. (Потому что мороженое - моя любимая еда). (Обратите внимание, что моя любимая еда может измениться на Mango в будущем)
  2. Написать код, чтобы поесть Манго. (Потому что манго - моя любимая еда). (Пожалуйста, обратите внимание, что моя любимая еда может измениться к мороженому в будущем)

Ниже интерфейс

interface IEatFavoriteFood 
{ 
    void eat(); 
} 

После будут мои конкретные классы.

class EatMango 
{ 
    void eat() 
    { 
    // Some code to eat mango 
    } 
} 


class EatIceCream 
{ 
    void eat() 
    { 
    // Some code to eat ice cream 
    } 
} 

Таким образом, мне нужно будет иметь две основные программы отдельно для двух моих проектов, так как я буду инициализировать два различные конкретные классов для интерфейса IEatFavoriteFood вызвать eat().

Main() 
{ 
    IEatFavoriteFood iff = new EatMango(); 
    iff.eat(); 
} 

и

Main() 
{ 
    IEatFavoriteFood iff = new EatIceCream(); 
    iff.eat(); 
} 

В дополнение к этому, если когда-нибудь в будущем любимые изменения еды к Mango в первом проекте, то мне придется переписать инициализации и повторной компиляции мой проект. Есть ли лучший способ реализовать эту функциональность. Использует ли конфигурационный файл в этом случае смысл?

ответ

4

Для инъекций зависимости для работы вам нужно место, в котором перечислены конкретные типы, который знает, какой конкретный класс подключается к вашим возможным зависимостям (интерфейсу).

В инфраструктурах инъекций зависимостей это часто делается с какой-то конфигурацией либо с помощью кода, либо с помощью некоторых внешних файлов (например, некоторой конфигурации XML).

Для вашей цели это, вероятно, самый простой способ начать простую и просто иметь некоторую «центральную сущность», которая предоставляет вам ваши зависимости. Это может быть, например, FavoriteFoodFactory:

public class FavoriteFoodFactory 
{ 
    public static IEatFavoriteFood GetFavoriteFood() 
    { 
     return new EatIceCream(); 
    } 
} 

Так что в вашем Main, вы бы тогда просто спросить, что завод, чтобы дать вам все, что любимая еда в настоящее время настроен:

Main() 
{ 
    IEatFavoriteFood iff = FavoriteFoodFactory.GetFavoriteFood(); 
    iff.eat(); 
} 

Конечно, это только смещает ответственность за создание конкретного объекта в другом месте, но это именно то, что нужно для инъекций зависимости. Чтобы иметь что-то на самом верху, которое заботится о том, как разрешить зависимость, удаление необходимо знать от компонентов ниже.

2

Я предлагаю вам использовать контейнер IOC, такой как Autofac (http://autofac.org/), Ninject (http://www.ninject.org/) или что вам больше всего нравится. Контейнер предоставит вам различные способы обработки такого сценария. Например, в Autofac вы можете создать модуль (класс, содержащий регистрацию конкретных классов, которые будут использоваться контейнером), которые могут быть загружены/выбраны с помощью web.config или кода. Вы можете увидеть подробную документацию здесь с примерами http://docs.autofac.org/en/latest/configuration/modules.html

Пожалуйста, обратите внимание, что использование контейнера МОК может быть легким, но в большинстве случаев вы должны знать о жизненном цикле компонентов, чтобы избежать возможных проблем и утечку памяти.

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