首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在.NET内核中注入通用接口

在.NET内核中注入通用接口
EN

Stack Overflow用户
提问于 2019-05-15 07:17:55
回答 4查看 42K关注 0票数 26

我想将这个接口注入我的控制器:

代码语言:javascript
运行
复制
public interface IDatabaseService<T>
{
    IEnumerable<T> GetList();
    ...
}

我想使用泛型,因为在我的WebApi项目中,我有诸如ProjectControllerTaskController等控制器,我希望对每种类型(例如,IDatabaseService<Project>IdatabaseService<Task>等)使用通用接口。

类,它将被注入控制器,如下所示:

代码语言:javascript
运行
复制
public class ProjectService : IDatabaseService<Project>
{
    private readonly DbContext context;

    public ProjectService(DbContext context)
    {
        this.context = context;
    }

    public IEnumerable<Project> GetList() { }
    ...
}

但是当我试图弹出我的Startup.cs

代码语言:javascript
运行
复制
services.AddScoped<IDatabaseService<T>>();

我需要通过T类型。

我的问题是,如何使注入通用和如何适当地注入控制器?例如:

代码语言:javascript
运行
复制
public class ProjectController : ControllerBase
{
    private readonly ProjectService projectService;

    public ProjectController (IDatabaseService<Project> projectService)
    {
        this.projectService = projectService;
    }
}

如果能成功的话?而将通用接口注入到控制器中是否是好的做法呢?如果没有,如何做得更好?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-05-15 08:11:54

1.)如果你想写硬代码

代码语言:javascript
运行
复制
services.AddScoped<IDatabaseService<Project>, ProjectService>();

2.)如果要动态注册所有类型的已实现的IDatabaseService<>

代码语言:javascript
运行
复制
        System.Reflection.Assembly.GetExecutingAssembly()
            .GetTypes()
            .Where(item => item.GetInterfaces()
            .Where(i => i.IsGenericType).Any(i => i.GetGenericTypeDefinition() == typeof(IDatabaseService<>)) && !item.IsAbstract && !item.IsInterface)
            .ToList()
            .ForEach(assignedTypes =>
            {
                var serviceType = assignedTypes.GetInterfaces().First(i => i.GetGenericTypeDefinition() == typeof(IDatabaseService<>));
                services.AddScoped(serviceType, assignedTypes);
            });
票数 25
EN

Stack Overflow用户

发布于 2019-05-15 07:27:48

您可以通过在Startup.cs中添加下面一行来做到这一点

代码语言:javascript
运行
复制
// best practice  
services.AddTransient(typeof(IDatabaseService<>),typeof(DatabaseService<>));

访问这里,了解更多关于ASP.NET核心中的依赖注入的信息

票数 65
EN

Stack Overflow用户

发布于 2019-05-15 09:08:44

您可以使用services.AddScoped只使用范围请求中的一个实例。因此,与AddTransient相比,总体上的改进

代码语言:javascript
运行
复制
services.AddScoped(typeof(IGenericRepository<>), typeof(GenericRepository<>));

因此,我的接口和类将如下所示

代码语言:javascript
运行
复制
public interface IGenericRepository<T> where T : class
代码语言:javascript
运行
复制
public class GenericRepository<T> : IGenericRepository<T> where T : class
票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56143613

复制
相关文章

相似问题

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