首页 > 解决方案 > 在 .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 的代码

标签: c#asp.net-core.net-corerepository-patternunit-of-work

解决方案


这些错误是什么意思?

这些错误意味着您正在通过构造函数依赖注入使用服务,但您尚未将这些服务注册到 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);

推荐阅读