Morpheus_God
@Morpheus_God

Подмена реализации интерфейса без перекомпиляции проекта. Как реализовать?

Добрый день. Каким образом можно подменять реализацию функционала в готовой программе?
Приведу пример. У меня есть интерфейс:
public interface IMessage
    {
        string GetMessage();
    }

Есть класс который его реализует:
public class Message : IMessage
    {
        public string GetMessage()
        {
            return "Hello From Message Class";
        }
    }

Есть форма которая создает переменную класса и выводит результат работы метода в MessageBox:
public partial class Form1 : Form
    {
        private readonly IMessage m;

        public Form1()
        {
            InitializeComponent();
            m = new Message();
        }

        private void Clickbtn_Click(object sender, EventArgs e)
        {
            MessageBox.Show(m.GetMessage());
        }
    }

Меня же интересует следующее, к примеру у меня класс который реализует интерфейс будет в отдельной dll библиотеке.
И мне захотелось иначе реализовать интерфейс. И что бы я мог просто создать новую dll библиотеку и положить в папку с программой. Возможно ли такое? Получается мне что то на подобии создания плагинов надо. При помощи какой технологии можно подобное сделать?
Заранее спасибо за ответы.
  • Вопрос задан
  • 243 просмотра
Решения вопроса 3
freeExec
@freeExec
Участник OpenStreetMap
Через reflection. Грузите свою сборку, ищите классы, которые реализуют нужный вам интерфейс и используете их.
Ответ написан
Комментировать
lexxpavlov
@lexxpavlov
Программист, преподаватель
//m = new Message();
m = MessageFactory.GetMessage();

А вот в MessageFactory уже искать тот метод, который создаст нужный объект (например, как указал freeExec).

Как вариант - использовать IoC-контейнер:
1) в главной сборке создать контейнер.
2) найти нужную сборку и передать в неё этот контейнер
3) в той сборке забиндить нужный класс на этот интерфейс в переданном контейнере.

Тот же приём можно использовать, когда в решении есть два проекта, второй проект использует первый проект (первый добавлен в зависимостях), а вот первому нельзя добавить второй проект в зависимостях. Решение - контейнер в первом проекте, а классы биндятся во втором. Тогда пункт 2 не нужен.
Ответ написан
Комментировать
Nipheris
@Nipheris Куратор тега C#
Получается мне что то на подобии создания плагинов надо. При помощи какой технологии можно подобное сделать?

Managed Extensibility Framework (MEF)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы