【问题标题】:Same interface in different domains/project不同域/项目中的相同界面
【发布时间】:2010-11-14 21:05:15
【问题描述】:

我遇到了这个问题:

实现 IProduct 接口的 SQLBackend 中的产品类。

我还在 SAPBackend(ERP、会计软件)中获得了一个产品,它实现了相同的 IProduct。

两个后端都在不同的项目中。

我希望能够在这两个项目之间使用传递产品,因此我需要相同的通用接口。

我正在考虑将 IProduct 放在一个公共接口项目中,但如果有很多常见案例,那么该项目中会导致相当多的接口。如果只是导致我将这些接口暴露给相当多的项目

我想知道是否有更好的情况,让 SAPBackend 和 SQLBackend 各自独立并且仍然共享一个公共接口?

namespace Interfaces
{
    public interface IProduct
    {
        string name {set; get;}
    }

}
namespace Sqlbackend
{
    public class Product : IProduct
    {
        public string name { set; get; }
     }
}
namespace ERPbackend
{
    public class Product : IProduct
    {
        public string name { set; get; }
    }
}

【问题讨论】:

    标签: c# .net design-patterns interface


    【解决方案1】:

    .NET 中的类型由它们的程序集限定。除非接口在同一个程序集中,否则它不是同一类型,不会被视为同一类型(转换将失败等)。

    因此,您将在此处需要项目之间的参考;最常见的是第三个 dll,其中只有常见的类型和接口。

    如果您在两个层之间执行基于合同的 SOA(例如通过 WCF),则例外情况。但我不认为这是你想要的。

    【讨论】:

      【解决方案2】:

      SQL 后端的IProduct 与ERP 后端的含义不同,所以我不会让它们共享同一个接口。

      分别实现两个后端,然后使用预定义的格式并使用理解两者的类在它们之间传递数据。该类可以读取 ERP IProduct 并写入 SQL IProduct

      namespace ERPBackend
      {
              interface IProduct
              {
                      string Code { get; }
                      string Description { get; }
              }
      
              class ProductForm
              {
                      public IProduct CreateProductFromInput()
                      {
                              ...
      
                              return product;
                      }
              }
      }
      
      namespace SQLBackend
      {
              interface IProduct
              {
                      string Id { get; }
                      string Description { get; }
              }
      
              class ProductDB
              {
                      public void SaveProduct(IProduct product)
                      {
                              ...
                      }
              }
      }
      
      namespace MyApplication
      {
              class ProductController
              {
                      private ProductForm form;
                      private ProductDB db;
      
                      public ProductController(ProductForm form, ProductDB db)
                      {
                              this.form = form;
                              this.db = db;
                      }
                      public void AddProduct()
                      {              
                              ERPBackend.IProduct product1 = form.CreateProductFromInput();
                              SQLBackend.IProduct product2 =
                                      new SQLBackend.MyProduct(product1.Code, product1.Description);
                              db.SaveProduct(product2);
                      }
              }
      }
      

      【讨论】:

        猜你喜欢
        • 2022-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-31
        • 1970-01-01
        • 2020-04-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多