Я пытаюсь создать класс обслуживания, где я хотел бы ввести простой промышленный метод 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. Поэтому ключ заключается в том, что я должен ссылаться на любое связанное с привязкой расширение в этом проекте, где я определяю привязки. Во всяком случае, звучит логично ...
Не могли бы вы отправить полную ошибку с помощью stacktrace? Могли бы вы также создать и опубликовать тестовый реестр? Потому что я не могу воспроизвести эту проблему; в зависимости от 'Func' должен просто работать ... –
nemesv
Я подготовил чистый небольшой проект, и активация работает хорошо там. Мой настоящий проект довольно большой, и я использую некоторые настройки для Ninject. Я отредактирую свой вопрос, чтобы сообщить подробности. –