【问题标题】:How can i decouple this project我怎样才能解耦这个项目
【发布时间】:2018-03-02 12:02:23
【问题描述】:

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

我知道如何为此使用 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 的使用引用并仅解决存储库依赖关系,我是否必须在业务层中定义存储库接口才能做到这一点?

【问题讨论】:

  • 你对 DI 的工作原理以及为什么接口在这里很重要没有清晰的理解。如果您有任何使用具体类进行 DI 的想法,请尝试实现它并告诉我们您在其中遇到什么问题。
  • 解耦并不一定意味着删除整个引用 - 此时您正在查看插件等,这完全是另一个主题。
  • 但是业务层直接依赖于数据库层,你不同意吗?

标签: c# asp.net asp.net-mvc dependency-injection decoupling


【解决方案1】:

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

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

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

您的业务层在数据访问层中将始终具有物理依赖关系,但在数据访问实现中将没有依赖关系。

【讨论】:

  • 我得到了启动解决依赖,但是我怎样才能摆脱 dll 依赖,数据访问实现将是具体的存储库
  • 所以本质上它并没有真正消除物理依赖性吗?
  • 不,不是,想想,你需要拉数据吧?所以你需要一个数据拉取的桥梁。
  • 使用接口的重点是隐藏实现,让你的业务层不知道事情是如何完成的。
  • hidden implementations 明白了,好的,所以这是我的两分钱,然后从这个学习练习中,基本上我在启动权中注册并解决我的所有依赖项,然后在这种情况下我可以使用数据库.Interfaces 命名空间调用 iRepositry 并使用启动时注册的服务在业务层的 contentPanel 类中解析它吗?
猜你喜欢
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 2012-09-02
相关资源
最近更新 更多