Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不同域/项目中的相同接口_C#_.net_Design Patterns_Interface - Fatal编程技术网

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

C# 不同域/项目中的相同接口,c#,.net,design-patterns,interface,C#,.net,Design Patterns,Interface,我得到了这个问题: 实现IPProduct接口的SQLBackend中的Product类 我还在SAP后端(ERP、会计软件)中得到了一个实现相同IPProduct的产品 两个后端都位于不同的项目中 我想能够使用传递这两个项目之间的产品,所以我需要相同的通用接口 我在考虑将IPProduct放在一个公共接口项目中,但如果有很多公共案例,那么会导致该项目中有很多接口。如果只是为了实现这一点,我会将这些接口公开给很多项目 我想知道是否有更好的情况让SAPBackend和SQLBackend自己站在一

我得到了这个问题:

实现IPProduct接口的SQLBackend中的Product类

我还在SAP后端(ERP、会计软件)中得到了一个实现相同IPProduct的产品

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

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

我在考虑将IPProduct放在一个公共接口项目中,但如果有很多公共案例,那么会导致该项目中有很多接口。如果只是为了实现这一点,我会将这些接口公开给很多项目

我想知道是否有更好的情况让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; }
    }
}

NET中的类型由其程序集确定作用域。除非接口位于相同的程序集中,否则它不是相同的类型,不会被视为相同的类型(cast将失败等)

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


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

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

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

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);
                }
        }
}