首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有参数的开放泛型的依赖注入

带有参数的开放泛型的依赖注入
EN

Stack Overflow用户
提问于 2021-06-23 03:40:40
回答 2查看 349关注 0票数 4

This文章讨论了如何在.Net核心中注册泛型接口。然而,我有一个泛型接口,它有多个参数,在弄清楚注册和构造函数注入时遇到了麻烦。

我的接口有4个参数

代码语言:javascript
运行
复制
public class TestImplementation 
{
    // Try to inject IRepository here ??????
    public TestImplementation(.......)
    {
        ...
    }
}

public class Repository : IRepository<Test1, Test2, Test3, Test4> 
{
    ...
}

public interface IRepository<T, U, V, W> where T : ITemplate1 where U : ITemplate2,...  
{
    ...
}

如果我尝试将接口注入到任何类,它会给出错误,因为即使在代码的其他部分使用以下代码也无法解析接口

代码语言:javascript
运行
复制
services.GetService(typeof(IRepository<,,,>))

我尝试使用构造函数注入,但它使编译器不满意(无法解析类型‘....Interface...’的服务。)同时尝试激活xxxx),因为我想保持接口打开。但是,我在代码中解析了该接口

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-28 07:50:15

正确的方法是不注入Repository服务。它应该只作为一个有功能的模板使用。然后创建一个继承自Repository类的附加类和一个继承自IRepository的接口。这样,您可以分配泛型值的值,然后以一种整洁和受控的方式注入它。

乍一看,这个模式似乎有点额外的工作,但它允许为每个表存储库提供自定义功能,使您能够清楚地了解您正在处理的是哪个表,并允许轻松替换不同数据库。如下例所示:

现在,创建您的RepositoryIRepository接口:

代码语言:javascript
运行
复制
public abstract class Repository<T, U, V, W> : IRepository<T, U, V, W> 
{
    ...
}

public interface IRepository<T, U, V, W> where T : ITemplate1 where U : ITemplate2,...  
{
    ...
}

现在为您的特定表创建一个接口。首先是接口:

代码语言:javascript
运行
复制
public interface ISomeTableRepository : IRepository<input_1, input_2, ...> {}

现在创建类存储库:

代码语言:javascript
运行
复制
public class SomeTableRepository : Repository<input_1, input_2,...> , ISomeTableRepository {}

现在,您可以将这些注册到Startup.cs文件中没有输入的新存储库。

代码语言:javascript
运行
复制
services.AddScoped<ISomeTableRepository, SomeTableRepository> ();

现在您可以轻松地注入它,而不需要添加参数:

代码语言:javascript
运行
复制
public class TestImplementation 
{
    readonly ISomeTableRepository _someTable;

    
    public TestImplementation(ISomeTableRepository someTable)
    {
        _someTable = someTable;
    }
}
票数 7
EN

Stack Overflow用户

发布于 2021-06-30 09:33:14

无论您需要在未绑定的泛型类型中包含哪些成员,都可以将其放入派生类型实现的基类型中。

对于未知类型的值,可以使用objectdynamic

请参阅此示例:

代码语言:javascript
运行
复制
public interface IRepository
{
    object TV { get; set; }
    object UV { get; set; }
    object VV { get; set; }
    object WV { get; set; }
}

public interface IRepository<T, U, V, W>: IRepository
{
    object IRepository.TV { get => TV; set => TV = (T)value; }
    object IRepository.UV { get => UV; set => UV = (U)value; }
    object IRepository.VV { get => VV; set => VV = (V)value; }
    object IRepository.WV { get => WV; set => WV = (W)value; }
    new T TV { get; set; }
    new U UV { get; set; }
    new V VV { get; set; }
    new W WV { get; set; }
}

然后,您可以执行以下操作:

代码语言:javascript
运行
复制
services.GetService(typeof(IRepository))

没有任何问题。

https://dotnetfiddle.net/kwoOOe

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68089857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档