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);