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

Я связываю один из внешних ресурсов во время выполнения в моем коде, используя что-то вроде ниже:

System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom("MyNice.dll");
            Type type = assembly.GetType("MyType");
            Tool = Activator.CreateInstance(type) as Tool;

Теперь, как вы можете видеть, в конце создания объекта он должен привести полученный объект к классу инструментов, потому что в моем коде есть много ссылок на методы и свойства класса Tool, что если его там нет, то код выдаст ошибку во время компиляции.

Теперь, это плохая ситуация, потому что я хотел удалить Dll из моих ссылок и динамически загружать его во время выполнения, но в то же время есть фрагменты моего кода, которые ссылаются на сборку Tool и зависят от нее. Как я могу сделать это независимым? Должен ли я использовать отражение во всем моем коде, или есть какая-нибудь легкая альтернатива?

например:

if (Tool.ApplicationIsOpen)
                    return StatusResult.Success;

есть в том же классе, который предполагает, что класс Tool уже существует и сломается, если я удалю его из моей справочной папки.

Есть предложения?

1 ответ

Я бы предложил создать общую библиотеку DLL для ссылок из обоих проектов, которая содержит интерфейс, в котором наследуется Tool.

В этом общем проекте создайте интерфейс, такой как ITool, который предоставляет функциональность, необходимую для потребительского проекта.

Общий проект

public interface ITool
{
    void Something();
}

Отдельный проект

public class Tool : ITool
{
    public void Something()
    {
        // do something
    }
}

Потребительский проект

System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFrom("MyNice.dll");
Type type = assembly.GetTypes().FirstOrDefault(t => t.IsAssignableFrom(typeof(ITool)));
ITool tool = Activator.CreateInstance(type) as ITool;

Теперь вы можете удалить ссылку на проект, содержащий Tool, но вам все еще нужна ссылка на общий проект, который содержит ITool. Если вы действительно не хотите никаких ссылок, то изучите маршрут отражения, но имейте в виду, что он, вероятно, будет грязным.

Эта стратегия является основой для многих систем плагинов. Я бы порекомендовал вам проверить некоторые библиотеки Dependency Injection (DI для краткости), которые могут сделать для вас большую работу.

Вот список библиотек DI: http://www.hanselman.com/blog/ListOfNETDependencyInjectionContainersIOC.aspx Лично я в последнее время использую Ninject.

Некоторые соответствующие ссылки:

Другие вопросы по тегам