IUnityContainer.Resolve <T> видає помилку, стверджуючи, що її не можна використовувати з параметрами типу


75

Вчора я впровадив код:

CustomerProductManager productsManager = container.Resolve<CustomerProductManager>();

Це було складно і робоче.

Сьогодні (мабуть, я щось змінив) я постійно отримую помилку:

Неродовий метод 'Microsoft.Practices.Unity.IUnityContainer.Resolve (System.Type, рядок, параметри Microsoft.Practices.Unity.ResolverOverride [])' не можна використовувати з аргументами типу

Мій колега має однаковий вихідний код і не має однакову помилку. Чому? Як вирішити проблему?

PS

рядок "за допомогою Microsoft.Practices.Unity;" присутній у розділі використання.

Я намагався замінити загальну версію на загальну:

CustomerProductManager productsManager = (CustomerProductManager)container.Resolve(typeof(CustomerProductManager));

І отримав ще одну помилку:

Немає перевантаження для методу 'Resolve', що приймає аргументи '1'

Здається, на одну з асамблей немає посилань .. але на яку? У мене на них посилається 2: 1. Microsoft.Practices.Unity.dll 2. Microsoft.Practices.ServiceLocation.dll

PPS Я бачив подібну проблему http://unity.codeplex.com/WorkItem/View.aspx?WorkItemId=8205, але вона вирішена як "не помилка"

Будь-яка думка буде корисною


Ви використовуєте Unity 2.0?
Вадим

3
Ви, мабуть, виявите, що надбудова Power Commands видаляє невикористаний простір імен за допомогою речень; простір імен "не використовується", коли ваш код знаходиться у некомпільованому стані, і ви, ймовірно, маєте звичку зберігати файл під час редагування - а надбудова видаляє зайве використання при збереженні.
Curt Nichols

Відповіді:


174

У мене була та ж проблема, і я знайшов "виправлення", дивлячись на файли зразків коду Prism. Схоже, навіть якщо це не dll у Unity V2, вам потрібно додати посилання у своєму класі на: Microsoft.Practices.Unity

мій повний розділ "використання" такий

using System;
using System.Windows;
using Microsoft.Practices.Composite.Modularity;
using Microsoft.Practices.Unity;
using Microsoft.Practices.Composite.UnityExtensions;

Я не впевнений, що ви використовуєте Silverlight, але загальна версія для Container.Resolve IS у Microsoft.Practices.Unity.


9
Точно так. Деякий час тому я виявив, що додавання "за допомогою Microsoft.Practices.Unity;" вирішує проблему.
Будда,

1
Це спрацювало і мене, але проклятий resharper зараз стогне про невикористані "використання директив".
IbrarMumtaz

6
Причина полягає в тому, що Resolve з параметром type - це метод розширення, знайдений у Microsoft.Practices.Unity, тоді як Resolve () без параметра type - це просто метод на інтерфейсі (або класі).
Джефф

1
Дякую! Всі ці роки пізніше, і це просто сталося за абсолютно новим кодом. HttpClient так само, як із цими "прихованими" секретами розширень. Не фанат. Мені подобається Простий інжектор.
TheDev6,

12
І FWIW, у новому, імовірно, високосумісному Unity 5, простір імен зараз є Unityі ні Microsoft.Practices.Unity.
Кен Сміт,

43

Microsoft більше не є власником Unity, і вона у версії 5 тепер є простором імен:

using Unity;

Переконайтеся, що у вашому розділі використання є:

container.Resolve<T>();

1
Зауважте, що у випадку, якщо ви використовуєте Prism, поточна стабільна версія (6.3.0) Prism все ще використовує Unity 4.0.1, де вам все одно доведетьсяusing Microsoft.Practices.Unity;
Рей

Серйозно, цей зводив мене з розуму. Дякую!
str8ball

1

Я зіткнувся з цією проблемою, і жодна з цих відповідей мені не допомогла. Я отримував помилку часу компіляції

Невідомий метод RegisterType () Microsoft.Practices.Unity.IUnityContainer

для мого коду нижче.

Container.RegisterType<IMyInterface, MyClass>();

Я виявив, що якщо ви не застосували IMyInterfaceдо класу MyClass, ви отримаєте цю проблему. Сподіваюся, це вирішить і для вас ...


0

У моїй ситуації клас, який я обгортав Unity, успадкований від абстрактного базового класу, і цей базовий клас НЕ мав безпараметричного конструктора. Після того, як я змінив свій код на використання безпараметричного конструктора для базового класу, проблема зникла.


0

У моїй ситуації я мав Bootstrapper реалізувати власний Resolve без загальної версії, тому він не міг знайти Unity Resolve від Microsoft. Додавання правильного використання використовувало трюк.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.