C# 使用简单注入器在开放注册中获取泛型参数类型

C# 使用简单注入器在开放注册中获取泛型参数类型,c#,generics,dependency-injection,simple-injector,C#,Generics,Dependency Injection,Simple Injector,我试图在开放注册中获取泛型参数类型,而不必使用对象。以下是代码片段: container.Register(typeof(IRepository<>), () => new Repository<object>("connString"), Lifestyle.Transient); container.Register(typeof(IRepository)), ()=>新存储库(“connString”), 生活方式(短暂的); 因此,在la

我试图在开放注册中获取泛型参数类型,而不必使用对象。以下是代码片段:

container.Register(typeof(IRepository<>),
    () => new Repository<object>("connString"),
    Lifestyle.Transient);
container.Register(typeof(IRepository)),
()=>新存储库(“connString”),
生活方式(短暂的);

因此,在lambda中,我希望使用特定的泛型类型来实例化存储库,而不是使用对象。

接受lambda的
Register
重载不支持泛型。原因是Simple Injector将无法再为您分析对象图,也无法代表您进行任何分析

有多种解决方案,但最简单的可能是将连接字符串参数提取到数据对象中,并让存储库依赖于此:

public class ConnectionStringSettings
{
    public readonly string ConnectionString;

    public ConnectionStringSettings(string connectionString) {
        this.ConnectionString = connectionString;
    }
}

container.RegisterSingleton(new ConnectionStringSettings("constr"));
container.Register(typeof(IRepository<>), typeof(Repository<>));
公共类连接字符串设置
{
公共只读字符串连接字符串;
公共连接字符串设置(字符串连接字符串){
this.ConnectionString=ConnectionString;
}
}
集装箱登记单(新的连接字符串设置(“constr”);
容器注册(typeof(IRepository),typeof(Repository));
另一个选项是使用条件注册直接注册连接字符串:

container.RegisterConditional(typeof(string),
    Lifestyle.Singleton.CreateRegistration(typeof(string),
        () => "constr", container),
   c => c.Consumer.ImplementationType.Name == typeof(Repository<>).Name);
container.RegisterConditional(类型为(字符串)),
生活方式.Singleton.CreateRegistration(typeof(string),
()=>“施工”,集装箱),
c=>c.Consumer.ImplementationType.Name==typeof(Repository.Name);
通过这种方式,可以保持构造函数参数不变。缺点是这种注册比较复杂,而且这种条件注册只适用于字符串之类的引用类型。我们可能会在v4中这样做

另一个选项是显式注册所有实现:

container.Register<IRepository<User>>(() => new Repository<User>("connString"));
container.Register<IRepository<Order>>(() => new Repository<Order>("connString"));
container.Register<IRepository<Asset>>(() => new Repository<Asset>("connString"));
container.Register(()=>newrepository(“connString”);
container.Register(()=>newrepository(“connString”);

container.Register接受lambda的
Register
重载不支持泛型。原因是Simple Injector将无法再为您分析对象图,也无法代表您进行任何分析

有多种解决方案,但最简单的可能是将连接字符串参数提取到数据对象中,并让存储库依赖于此:

public class ConnectionStringSettings
{
    public readonly string ConnectionString;

    public ConnectionStringSettings(string connectionString) {
        this.ConnectionString = connectionString;
    }
}

container.RegisterSingleton(new ConnectionStringSettings("constr"));
container.Register(typeof(IRepository<>), typeof(Repository<>));
公共类连接字符串设置
{
公共只读字符串连接字符串;
公共连接字符串设置(字符串连接字符串){
this.ConnectionString=ConnectionString;
}
}
集装箱登记单(新的连接字符串设置(“constr”);
容器注册(typeof(IRepository),typeof(Repository));
另一个选项是使用条件注册直接注册连接字符串:

container.RegisterConditional(typeof(string),
    Lifestyle.Singleton.CreateRegistration(typeof(string),
        () => "constr", container),
   c => c.Consumer.ImplementationType.Name == typeof(Repository<>).Name);
container.RegisterConditional(类型为(字符串)),
生活方式.Singleton.CreateRegistration(typeof(string),
()=>“施工”,集装箱),
c=>c.Consumer.ImplementationType.Name==typeof(Repository.Name);
通过这种方式,可以保持构造函数参数不变。缺点是这种注册比较复杂,而且这种条件注册只适用于字符串之类的引用类型。我们可能会在v4中这样做

另一个选项是显式注册所有实现:

container.Register<IRepository<User>>(() => new Repository<User>("connString"));
container.Register<IRepository<Order>>(() => new Repository<Order>("connString"));
container.Register<IRepository<Asset>>(() => new Repository<Asset>("connString"));
container.Register(()=>newrepository(“connString”);
container.Register(()=>newrepository(“connString”);
集装箱。登记