C# 访问参数构造所请求服务的通用类型
我有一个强类型配置的服务合同:C# 访问参数构造所请求服务的通用类型,c#,generics,dependency-injection,autofac,factory-pattern,C#,Generics,Dependency Injection,Autofac,Factory Pattern,我有一个强类型配置的服务合同: public interface IConfigurationSource<TConfiguration> { TConfiguration Current { get; } } 公共接口IConfigurationSource{ t配置电流{get;} } 以及基于YAML文件的实现: public class YamlFileConfigurationSource<TConfiguration> : IConfig
public interface IConfigurationSource<TConfiguration> {
TConfiguration Current { get; }
}
公共接口IConfigurationSource{
t配置电流{get;}
}
以及基于YAML文件的实现:
public class YamlFileConfigurationSource<TConfiguration>
: IConfigurationSource<TConfiguration> {
public YamlFileConfigurationSource(string fileName) { }
...
}
公共类YamlFileConfigurationSource
:i配置源{
公共YamlFileConfigurationSource(字符串文件名){}
...
}
现在,我正在尝试在Autofac中注册实现,以便根据请求服务的泛型类型构造fileName
参数。因此,当客户端请求YamlFileConfigurationSource
时,可以提供类似MyCustomConfigurationModel.config的路径
我已经试过使用
ContainerBuilder.RegisterGeneric()
,。WithConstructor()
和委托工厂,但是我不知怎么地看不到如何在注册期间访问泛型类型。YamlFileConfigurationSource
不应该依赖于文件名可以使用typeof获得它(t配置)
并将此依赖项添加到YamlFileConfigurationSource
注册将如下所示:
builder.RegisterGeneric(typeof(YamlFileConfigurationSource<>))
.As(typeof(IConfigurationSource<>));
builder.RegisterGeneric(typeof(SimpleConfigurationFileProvider<>))
.As(typeof(IConfigurationFileProvider<>));
它应该可以工作,但这是一种变通方法,而以前的解决方案更为优雅
public interface IConfigurationFileProvider<TConfiguration> {
String GetFileName();
}
public class SimpleConfigurationFileProvider<TConfiguration>
: IConfigurationFileProvider<TConfiguration> {
public String GetFileName() {
return typeof(TConfiguration) + ".config";
}
}
builder.RegisterGeneric(typeof(YamlFileConfigurationSource<>))
.As(typeof(IConfigurationSource<>));
builder.RegisterGeneric(typeof(SimpleConfigurationFileProvider<>))
.As(typeof(IConfigurationFileProvider<>));
builder.RegisterGeneric(typeof(YamlFileConfigurationSource<>))
.As(typeof(IConfigurationSource<>))
.WithParameter((pi, c) => pi.Name == "fileName",
(pi, c) => pi.Member.DeclaringType.GetGenericArguments()[0].Name);