Может ли Unity Container загружать сборки динамически? - PullRequest
3 голосов
/ 20 октября 2011

Я разрабатывал приложение.Я хочу, чтобы единство решало мои типы БЕЗ необходимости ссылаться на сборки в основном проекте.Я попытался загрузить загруженные сборки автоматически, настроив регистрацию типов с помощью, но, похоже, не работает, если не добавлю ссылку на сборку, содержащую зависимости.каталог?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 07 мая 2015

Я знаю, что это было задано некоторое время назад, но для любого, кто ищет ответ, вы должны убедиться, что Unity может найти сборки во время выполнения. Так что вам нужно либо поместить их в GAC, либо поместить сборочный dll в тот же каталог, что и исполняемый файл. Если вы используете другой каталог для зависимостей и у вас есть веб-приложение, то вам нужно установить элемент исследования в вашем файле web.config:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <probing privatePath="Dependencies" />
    </assemblyBinding>
</runtime>

И для любого, кто ищет фрагмент кода для решения этой проблемы, следующий код будет искать все сборки в указанном вами каталоге и регистрировать их в Unity:

string DependenciesPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Dependencies");
string[] Dependencies   = Directory.GetFiles(DependenciesPath, DLL_PATTERN);

Dictionary<Type, Type> pluginMappings = new Dictionary<Type, Type>();

//Load Dependency Assemblies
foreach (string fileName in Dependencies)
{
    string assemblyName = Path.GetFileNameWithoutExtension(fileName);
    if (assemblyName != null)
    {
        Assembly pluginAssembly = Assembly.Load(assemblyName);

        foreach (Type pluginType in pluginAssembly.GetTypes())
        {
            if (pluginType.IsPublic) //Only look at public types
            {
                if (!pluginType.IsAbstract)  //Only look at non-abstract types
                {
                    //Gets a type object of the interface we need the plugins to match
                    Type[] typeInterfaces = pluginType.GetInterfaces();
                    foreach (Type typeInterface in typeInterfaces)
                    {
                        if (pluginMappings.ContainsKey(typeInterface))
                        {
                            throw new DuplicateTypeMappingException(typeInterface.Name, typeInterface, pluginMappings[typeInterface], pluginType);
                        }
                        pluginMappings.Add(typeInterface, pluginType);
                    }
                }
            }
        }
    }
}

//Web API resolve dependencies with Unity
IUnityContainer container = new UnityContainer();
foreach (var mapping in pluginMappings)
{
    container.RegisterType(mapping.Key, mapping.Value);
}
3 голосов
/ 22 октября 2011

Звучит так, как будто вы хотите MEF, а не Unity.MEF предназначен для динамического обнаружения.

Прочтите ответ на этот вопрос: Чем отличаются MEF от Unity и его назначение?

0 голосов
/ 10 июля 2013

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

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

...