Внедренная в конструктор реализация имеет dll-зависимость, которая не используется - PullRequest
0 голосов
/ 30 мая 2018

Как вы знаете, Ninject связывает все интерфейсы с реализациями в корне композиции.У нас есть класс, который зависит от внешней библиотеки DLL, но мы не хотим развертывать его (физический файл DLL в каталоге bin), если он не используется.Класс ExampleClass хранится в нашем проекте Framework, это означает, что на него ссылается любое приложение, которое мы создаем.И именно поэтому мы получаем следующее при развертывании любого нашего приложения:

Не удалось загрузить файл или сборку ExternalDll, Версия = xxxxxx, Культура = нейтральный, PublicKeyToken = xxxxxxxxxxxxxxxx

Есть ли обходной путь, например, инкапсуляция реализации в другой класс или что-то еще?Или инициализация во время выполнения (шаблон Factory).Что из этого решит мою проблему?Я также попробовал Ленивое связывание, но безуспешно.

Внедрение в конструктор реализации, где используется внешняя DLL

namespace Framework
{
    public class ExampleClass
    {
        private readonly IUsesExternalDll _usesExternalDll;

        public ExampleClass(IUsesExternalDll usesExternalDll)
        {
            _usesExternalDll = usesExternalDll;
        }
    }
}

Интерфейс

public interface IUsesExternalDll
{

}

Реализация

using externalDll; //this using is a reference to external dll

public class UsesExternalDll : IUsesExternalDll
{

}

Переплет

kernel.Bind<IUsesExternalDll>().To<UsesExternalDll>().InTransientScope();

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Как я решил это:

1) Переместите привязку Ninject в конкретное приложение, где она используется (более высокий уровень).

2) Сделайте в конструкторе введенный параметр Optional.

namespace Framework
{
    public class ExampleClass
    {
        private readonly IUsesExternalDll _usesExternalDll;

        public ExampleClass([Optional] IUsesExternalDll usesExternalDll)
        {
            _usesExternalDll = usesExternalDll;
        }
    }
}

Необязательный атрибут приведет к созданию экземпляра только при наличии привязки.И поскольку я перенес привязки в конкретное приложение, в котором оно используется, во всех других приложениях я не получу ошибку Could not load file or assembly, поскольку UsesExternalDll не создается.

0 голосов
/ 31 мая 2018

Вы можете заменить связывание на условное связывание:

kernel.Bind(x => x.FromAssembliesMatching("AssemblyWhereUsesExternalDllIsLocated.dll")
    .SelectAllClasses()
    .BindAllInterfaces()
    .Configure(c => c.InTransientScope()));

Теперь типы внутри связаны только тогда, когда эта сборка найдена.

...