依赖注入

weixin_42843186 2018-11-19 09:46:42
我有两个服务 GooodsService,ProductService

我在Startup 中分别做了注册代码如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<GoodsContext>(options =>
options.UseMySql(Configuration.GetConnectionString("MySqlConnection")));//添加Mysql支持
services.AddUnitOfWork<GoodsContext>();//添加UnitOfWork支持
services.AddScoped(typeof(IGooodsService), typeof(GooodsService));//用ASP.NET Core自带依赖注入(DI)注入使用的类

services.AddDbContext<ProductContext>(options =>
options.UseMySql(Configuration.GetConnectionString("MySqlConnection")));//添加Mysql支持
services.AddUnitOfWork<ProductContext>();//添加UnitOfWork支持
services.AddScoped(typeof(IProductService), typeof(ProductService));//用ASP.NET Core自带依赖注入(DI)注入使用的类
services.AddMvc();
}



可以我在Controller 服务依赖的没有问题,可是服务的所绑定的IUnitOfWork 却是有问题的



ProductService 代码:
public class ProductService : IProductService
{
private readonly IUnitOfWork _unitOfWork;
public ProductService(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}

public string Query()......略


}}


GooodsService 代码:
public class GooodsService : IGooodsService
{

private readonly IUnitOfWork _unitOfWork;
public GooodsService(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}.....略
}

...全文
47 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_42843186 2018-11-19
  • 打赏
  • 举报
回复
问题解决了,确实是框架不能识别,要用那个DbContext ,我看了一下UnitOfWork 的源码如下:
public static IServiceCollection AddUnitOfWork<TContext>(this IServiceCollection services) where TContext : DbContext
{
services.AddScoped<IRepositoryFactory, UnitOfWork<TContext>>();
// Following has a issue: IUnitOfWork cannot support multiple dbcontext/database,
// that means cannot call AddUnitOfWork<TContext> multiple times.
// Solution: check IUnitOfWork whether or null
services.AddScoped<IUnitOfWork, UnitOfWork<TContext>>();
services.AddScoped<IUnitOfWork<TContext>, UnitOfWork<TContext>>();

return services;
}



services.AddScoped<IUnitOfWork, UnitOfWork<TContext>>();//调用的时候应该是用的是这个,那代码的GooodsService 和ProductService 的构造函数结构就是一样的,框架就没法知道要用那个就默认在容器中取了最后一个,


解决:代码做如下调整即可


private readonly IUnitOfWork<GoodsContext> _unitOfWork;
public GooodsService(IUnitOfWork<GoodsContext> unitOfWork)
{
_unitOfWork = unitOfWork;
}


感谢回答~!







  • 打赏
  • 举报
回复
你试试只注册一个DbContext看看呢,你这样写我感觉框架无法区别你到底要用哪个DbContext

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧