不同域/项目中的相同接口

时间:2009-07-28 21:42:56

标签: c# .net design-patterns interface

我遇到了这个问题:

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

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

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

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

我在考虑将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; }
    }
}

2 个答案:

答案 0 :(得分:6)

.NET中的类型由其程序集确定范围。除非界面在同一个程序集中,否则它不是同一类型,不会被视为相同类型(强制转换将失败等)。

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

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

答案 1 :(得分:2)

SQL后端中的IProduct与ERP后端中的IProduct具有不同的含义,因此我不会让它们共享相同的界面。

分别实现两个后端,然后使用预定义的格式和使用了解两者的类在它们之间传递数据。该类可以读取ERP IProduct并写入SQL 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); } } }

{{1}}