Я знаю, что есть много вопросов, похожих на этот, но на самом деле никто из них не решил мою проблему.Я создал новое приложение Asp.Net Core 2.Сейчас я пытаюсь использовать перехватчик для конкретной службы для извлечения некоторых данных в эту службу ( Я использую Castle.Core
пакет nuget ).У меня есть общий IConfigurationInterceptor<>
и реальная реализация ConfigurationInterceptor<>
Вот интерфейс:
public interface IConfigurationInterceptor<T> : IInterceptor where T : class { }
public class ConfigurationInterceptor<T> : IConfigurationInterceptor<T> where T : class
{
public ConfigurationInterceptor(ConfigurationInfo<T> configurationInfo,
some other services)
{
_configurationInfo = configurationInfo;
//.....
}
public void Intercept(IInvocation invocation)
{
invocation.ReturnValue = somefunc(someconfig, invocation.Arguments);
}
}
Тогда у меня есть метод расширения, как показано ниже:
public static void AddSingletonConfiguration<TInterface, TImplementation>(
this IServiceCollection services, string featureName)
where TImplementation : class, TInterface where TInterface : class
{
var info = new ConfigurationInfo<TImplementation>(featureName, typeof(TInterface));
var generator = new ProxyGenerator();
services.AddSingleton(x =>
{
var ic = x.GetService<Func<ConfigurationInfo<TImplementation>,
IConfigurationInterceptor<TImplementation>>>();
var icTemp = ic.Invoke(info);
return (TInterface) generator.CreateInterfaceProxyWithoutTarget(
info.ServiceType, icTemp);
});
}
Но когда я добираюсь до этой строки кода:
var ic = x.GetService<Func<ConfigurationInfo<TImplementation>,
IConfigurationInterceptor<TImplementation>>>();
он возвращает мне нулевое значение для ic
:
ConfigurationInfo
class - это просто простой класс, который я создаю дляхранение некоторых дополнительных данных.
public sealed class ConfigurationInfo<TImpl>
{
public Type ServiceType { get; }
public string FeatureName { get; }
public ConfigurationInfo(string featureName, Type serviceType)
{
FeatureName = featureName;
ServiceType = serviceType;
}
public override string ToString()
=> $"{FeatureName} ({ServiceType} -> {typeof(TImpl)})";
}
В моем ConfigureServices
есть обе эти строки:
services.AddSingleton(typeof(IConfigurationInterceptor<>),
typeof(ConfigurationInterceptor<>));
services.AddSingletonConfiguration<IStaticDataConfiguration, StaticDataConfiguration>(
"SomeFeatureKey");
Я не уверен, почему переменная ic
равна нулю, потому что ранее другой проект былиспользуя Autofac и работал отлично, но при запуске вы найдете что-то вроде этого:
builder.RegisterGeneric(typeof(ConfigurationInterceptor<>))
.As(typeof(IConfigurationInterceptor<>)).SingleInstance();
builder.RegisterConfiguration<IStaticDataConfiguration, StaticDataConfiguration>(
"SomeFeatureKey");
, а метод расширения был такой:
public static void RegisterConfiguration<TInterface, TImplementation>(
this ContainerBuilder builder, string featureName)
where TImplementation : class, TInterface
{
var info = new ConfigurationInfo<TImplementation>(featureName, typeof(TInterface));
var generator = new ProxyGenerator();
builder
.Register(c =>
{
var ic = c.Resolve<Func<ConfigurationInfo<TImplementation>,
IConfigurationInterceptor<TImplementation>>>()(info);
return generator.CreateInterfaceProxyWithoutTarget(info.ServiceType, ic);
})
.As<TInterface>()
.SingleInstance();
}
Любая помощь будет оценена.
РЕДАКТИРОВАНИЕ 1:
Теперь я изменил метод GetService<>
на метод GetRequiredService<>
и выдает исключение, как показано ниже:
Нет службы для типа 'Система.Func'2 [StaticDataProvider.DomainModel.ConfigurationInfo'1 [StaticDataProvider.Services.StaticDataConfiguration], StaticDataProvider.Services.Interfaces.IConfigurationInterceptor'1 [StaticDataProvider.Services.StaticDataConfiguration]] 'зарегистрирован.
РЕДАКТИРОВАТЬ 2:
Чтобы обернуть это, вот проблема: Вмой текущий проект в ядре Asp.Net я не могу получить Func<X, B>
, в то время как в проекте Asp.Net MVC 5 (это совершенно другой проект) я могу получить Func<X, B>
с помощью Autofac.Я думаю, что это связано с параметризованной функцией создания экземпляров в Autofac, предоставляемой по умолчанию: здесь
Теперь я не знаю, есть ли в контейнере DI по умолчанию в Asp.Net Core что-то вроде этого «параметризованной реализации'функция, которая позволяет мне разрешать Func<X, B>
вместо B
.