2013-12-02 2 views
1

Я пытаюсь создать класс обслуживания, где я хотел бы ввести простой промышленный метод Func<OtherService> в его конструктор. Тип OtherService - это класс, который должен быть самозависимым (и действительно, когда я ввожу его без фабрики).Какие именно шаги для автоматической инъекции Func <T>?

Я установил последнее ядро ​​Ninject и пакеты Ninject.Extensions.Factory NuGet. Когда я пытаюсь извлечь экземпляр из Ninject, я получаю исключение активации из-за невозможности активировать IntPtr.

Что я делаю неправильно? Если я правильно понимаю документацию расширения Factory, этот тип привязки Func должен быть автоматическим, без какой-либо конфигурации. Нужно ли мне регистрировать расширение Factory в любом месте или создать явное привязку для OtherService? Любые советы будут оценены.

EDIT:

У меня есть Ninject и Ninject.Extensions.Factory установлен в небольшом отдельном проекте, где я сделать некоторые настройки на Ninject. К ним относятся следующие:

Kernel.Components.Add<IInjectionHeuristic, CustomInjectionHeuristic>(); 
Kernel.Components.Add<IActivationStrategy, TransientDisposableActivationStrategy>(); 

где два пользовательских обработчиков для позволить мне использовать мой обычай [Service] атрибут для указания инъекции собственности, а также для обработки утилизации компонентов, которые используют свой собственный интерфейс IDisposableEx (с Disposed уведомлением) для тонкой настройки кеша Ninject.

public class CustomInjectionHeuristic : NinjectComponent, IInjectionHeuristic, INinjectComponent, IDisposable 
{ 
    public bool ShouldInject(MemberInfo member) 
    { 
     return member.IsDefined(typeof(ServiceAttribute), true); 
    } 
} 

public class TransientDisposableActivationStrategy : ActivationStrategy 
{ 
    public override void Activate(IContext context, InstanceReference reference) 
    { 
     var scope = context.GetScope(); 
     // care about only transient scoped objects 
     if (scope != null) return; 
     if (reference.Instance is Component) 
      reference.Instance.As<Component>().Disposed += 
       (sender, args) => context.Kernel.Components.Get<ICache>().Clear(sender); 
     if (reference.Instance is IDisposableEx) 
      reference.Instance.As<IDisposableEx>().Disposed += 
       (sender, args) => context.Kernel.Components.Get<ICache>().Clear(sender); 
    } 
} 

И я также использовать расширение Ninject.Extensions.NamedScope для InCallScope() привязок.

Любая из этих настроек может повлиять на правильную работу завода?

EDIT2:

Я думаю, что я получил его. Проблема в том, что мне приходится ссылаться на расширение Factory в моем проекте запуска, где я определяю привязки, а не в библиотеке классов, где у меня есть базовая настройка Ninject. Поэтому ключ заключается в том, что я должен ссылаться на любое связанное с привязкой расширение в этом проекте, где я определяю привязки. Во всяком случае, звучит логично ...

+0

Не могли бы вы отправить полную ошибку с помощью stacktrace? Могли бы вы также создать и опубликовать тестовый реестр? Потому что я не могу воспроизвести эту проблему; в зависимости от 'Func ' должен просто работать ... – nemesv

+0

Я подготовил чистый небольшой проект, и активация работает хорошо там. Мой настоящий проект довольно большой, и я использую некоторые настройки для Ninject. Я отредактирую свой вопрос, чтобы сообщить подробности. –

ответ

0

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

Смежные вопросы