我想将这个接口注入我的控制器:
public interface IDatabaseService<T>
{
IEnumerable<T> GetList();
...
}
我想使用泛型,因为在我的WebApi
项目中,我有诸如ProjectController
、TaskController
等控制器,我希望对每种类型(例如,IDatabaseService<Project>
、IdatabaseService<Task>
等)使用通用接口。
类,它将被注入控制器,如下所示:
public class ProjectService : IDatabaseService<Project>
{
private readonly DbContext context;
public ProjectService(DbContext context)
{
this.context = context;
}
public IEnumerable<Project> GetList() { }
...
}
但是当我试图弹出我的Startup.cs
services.AddScoped<IDatabaseService<T>>();
我需要通过T
类型。
我的问题是,如何使注入通用和如何适当地注入控制器?例如:
public class ProjectController : ControllerBase
{
private readonly ProjectService projectService;
public ProjectController (IDatabaseService<Project> projectService)
{
this.projectService = projectService;
}
}
如果能成功的话?而将通用接口注入到控制器中是否是好的做法呢?如果没有,如何做得更好?
发布于 2019-05-15 08:11:54
1.)如果你想写硬代码
services.AddScoped<IDatabaseService<Project>, ProjectService>();
2.)如果要动态注册所有类型的已实现的IDatabaseService<>
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);
});
发布于 2019-05-15 07:27:48
您可以通过在Startup.cs
中添加下面一行来做到这一点
// best practice
services.AddTransient(typeof(IDatabaseService<>),typeof(DatabaseService<>));
访问这里,了解更多关于ASP.NET核心中的依赖注入的信息
发布于 2019-05-15 09:08:44
您可以使用services.AddScoped只使用范围请求中的一个实例。因此,与AddTransient相比,总体上的改进
services.AddScoped(typeof(IGenericRepository<>), typeof(GenericRepository<>));
因此,我的接口和类将如下所示
public interface IGenericRepository<T> where T : class
public class GenericRepository<T> : IGenericRepository<T> where T : class
https://stackoverflow.com/questions/56143613
复制相似问题