c# - 在 .net 核心中注册 IUnitOfWork 作为服务
问题描述
我将在我的 asp.net 核心 mvc 应用程序中实现存储库模式,为此我正在尝试一个简单的演示应用程序,其中包括存储库和工作单元概念。 我的第一个仓库
public interface ICustomerRepository
{
bool Add();
bool Update();
bool Delete();
}
和
public class CustomerRepository:ICustomerRepository
{
public bool Add()
{
return true;
}
public bool Update()
{
return true;
}
public bool Delete()
{
return true;
}
}
第二个存储库
public interface IOrderRepository
{
bool Add();
bool Update();
bool Delete();
}
和
public class OrderRepository:IOrderRepository
{
public bool Add()
{
return true;
}
public bool Update()
{
return true;
}
public bool Delete()
{
return true;
}
}
工作单位
public interface IUnitOfWork
{
IOrderRepository Order {get;}
ICustomerRepository Customer { get; }
void Save();
void Cancel();
}
和
public class UnitOfWork:IUnitOfWork
{
public UnitOfWork(IOrderRepository order, ICustomerRepository customer)
{
Order = order;
Customer = customer;
}
public IOrderRepository Order { get; }
public ICustomerRepository Customer { get; }
public void Save() { }
public void Cancel() { }
}
在我的控制器中,
public class HomeController : Controller
{
IUnitOfWork UW { get; }
public HomeController(IUnitOfWork uw)
{
UW = uw;
}
public IActionResult Index()
{
UW.Customer.Add();
UW.Order.Update();
UW.Save();
return View();
}
}
我稍后会为 dapper 添加更多代码,但至少它应该可以在没有任何错误的情况下工作,但它会给我错误
InvalidOperationException:尝试激活“CoreTS.Controllers.HomeController”时无法解析“CoreTS.Repository.UnitOfWork.IUnitOfWork”类型的服务。
有人建议我在 ConfigureService 方法下的 startup.cs 中添加 IUnitOfWork 作为服务,如
services.AddSingleton<IUnitOfWork, UnitOfWork>();
在添加这个另一个错误之后
InvalidOperationException:尝试激活“CoreTS.Repository.UnitOfWork.UnitOfWork”时,无法解析“CoreTS.Repository.Order.IOrderRepository”类型的服务。
为了使它工作,我还必须在 startup.cs 中添加其他两个存储库
services.AddSingleton<IOrderRepository, OrderRepository>();
services.AddSingleton<ICustomerRepository, CustomerRepository>();
如果有 n 个存储库,我必须在 startup.cs 中添加每个人(根据此代码),解决方案是什么。
所以
1.] 这些错误是什么意思?
2.] 这里的正确配置是什么?
3.]在这里不添加n个存储库作为服务的方法是什么?
注意:如前所述,这只是为了理解模式的流程,我将在后面添加 Dapper 或 EF Core 的代码
解决方案
这些错误是什么意思?
这些错误意味着您正在通过构造函数依赖注入使用服务,但您尚未将这些服务注册到 DI 解析器。
这里的正确配置是什么?
您所做的是解决服务的正确方法。
不在这里添加 n 个存储库作为服务的方法是什么?
您可以在单独的文件中扩展IServiceCollection
如下。
public static class ServiceCollectionExtensions
{
public static IServiceCollection AddCustomServices(this IServiceCollection services,
IConfiguration configuration)
{
services.AddSingleton<IUnitOfWork, UnitOfWork>();
services.AddSingleton<IOrderRepository, OrderRepository>();
services.AddSingleton<ICustomerRepository, CustomerRepository>();
return services;
}
}
然后在启动类中如下:
services.AddCustomServices(Configuration);
推荐阅读
- python - TweepError: [{'code': 144, 'message': 'No status found with that ID.'}]
- javascript - 使用 jquery 克隆函数将类添加到表单的更多行时出现问题
- postgresql - 等待 docker run 的 pg 启动
- r - 使用 R 的 COVID-19 数据可视化
- discord.js - 如何测试用户对消息做出反应的表情符号?
- android - 如何在菜单项android之间添加分隔符
- javascript - 如何在 Vue-cli 中使用 props、$ref 和 $emit?
- ios - CocoaPods 找不到 pod“Firebase/Performance”的兼容版本:在 Ionic 5 中安装 Firebase X 时
- javascript - 无法连接到 smtp 服务器 deno
- ios - iOS swift录制的视频已删除,但应用程序数据仍然很大