我怎样才能解开这个项目

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我怎样才能解开这个项目相关的知识,希望对你有一定的参考价值。

我有一个场景,我的业务层以dll的形式直接引用到我的数据库层,该数据库层充当此项目中的存储库,现在这意味着对数据库层有直接依赖性,需要解耦,请见下面的结构:

Project Structure between Business layer and Database Layer Business layer directly referring to database

我知道如何使用DI和容器,但我想要一些提示以及如何以某种形式将其解耦而无需在业务层中添加IRepository接口,并且数据库层具有在业务层中调用irepository的具体存储库。这根本没有意义吗?

我有一个存储库接口,位于Database_Layer dll中:

 public interface IRepository
 {
    Task Add(Object item);

    Task Remove(int id);

    Task<Object> Find(int id);

    Task UpdateAsync(Object item);

    Task<IEnumerable<Object>> GetAllAsync();

    Task<IEnumerable<Object>> GetAllAsync(Object id);
}

然后我在业务层中有一个名为ContentPanel的类:

using Database_Layer.Interfaces;
namespace Business_Tier.Concrete
{
public class ContentPanel : IPanel
{
    IRepository _repository;
    public ContentPanel(IRepository repo)
    { 
        this._repository = repo;
    }

    public IResolver _Resolver { get; set; } = null;
    public IResolver Resolver { get => _Resolver; set => _Resolver.Resolve<IRepository>("ContentRepository",_repository); }

    public void Delete_Content_Panel(int id)
    {

    }

}

我想消除使用引用database_layer.interfaces并只解决存储库依赖性,我是否必须在Business层中定义存储库接口,以便执行此操作?

答案

业务层(dll)依赖于您的数据访问层(dll)

您需要使用接口从数据访问实现中抽象业务层合同

在Startup项目中使用DI将允许您将所需的实现注入该接口

业务层在数据访问层中始终具有物理依赖性,但在数据访问实现中不具有依赖性。

以上是关于我怎样才能解开这个项目的主要内容,如果未能解决你的问题,请参考以下文章

我怎样才能从我的项目中得到这个警告?

单个活动:带有 AppBarLayout 的片段

在导航抽屉片段中保存视图页面片段的状态

django admin 内联(和嵌套内联):我怎样才能获得这个功能?

从Activity设置子片段的ViewPager页面

Android中切换标签片段之间的延迟