将客户端DLL放在n层架构中以调用外部API的位置

时间:2018-04-03 08:35:41

标签: c# .net architecture

我们有一个带有DAL的n层架构 - > BL - >用户界面,分离。在我们的DAL中,我们有EF用于数据库访问。

我们要求从其他公司调用外部API。我们已经为我们提供了几个带有库的客户端.DLL文件,以使该过程无缝。

我们正在努力决定.DLL文件应该驻留在哪里。我们应该把它们放在DAL中,然后在DAL中进行调用,因为它是数据访问,或者我们应该把它全部放在BL中并在那里进行外部调用。因此,不要触及DAL并将其隔离,仅用于数据库访问。

非常感谢任何有关此事的建议。

2 个答案:

答案 0 :(得分:0)

首先,我们需要清楚提供给我们的外部DLL到底是什么,在大多数情况下,外部dll包含该特定第三方应用程序的业务逻辑。

在我看来,这就是为什么应该保留在你申请的BL中。并因此同意您的上一个声明,将DAL隔离,只是处理数据库操作。

答案 1 :(得分:0)

好的,听起来你应该引用数据访问层上的外部程序集beucase这个程序集的主要对象是检索数据。但是,当您在业务层使用数据访问层时,您也拥有此主体。我会去商业层。鉴于它是逻辑的一部分,那么你应该在那里进行这种访问。

另一点:如果您不熟悉在类库业务层项目中引用此程序集,则可以将其抽象为接口并在业务层上注入(通过IoC示例) 。使用这样的方法,您将把它保留在业务层上并隔离此API的访问权限。

对于示例,将其添加到您的域模型层(如果您使用的是):

public interface IExternalDataService
{
   IEnumerable<SomeDto> Getdata();

   SomeDto Getdata(object id);
}

在另一个类库项目中,添加程序集的refence并进行API调用,实现此接口:

public class ExternalDataService : IExternalDataService
{
   public IEnumerable<SomeDto> Getdata()
   {
        // consume the API (dll) here...
   }

   public SomeDto Getdata(object id)
   {
        // consume the API (dll) here...
   }
}

在你的BL课程中,取决于界面:

public class CustomerService
{
     public CustomerService(IExternalDataService externDataService)
     {
         ...
     }
}