2009-07-28 16 views
2

この問題が発生しました:異なるドメイン/プロジェクトの同じインタフェース

IProductインターフェイスを実装するSQLBackendの製品クラス。

私も同じIProductを実装SAPBackendでの製品(ERP、会計ソフト)を得ました。

バックエンドはどちらも別のプロジェクトにあります。

私はこの2つのプロジェクトの間で製品を渡すことができるようにしたいので、私は同じ共通のインターフェイスが必要です。

私は、共通のインタフェース・プロジェクトに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; } 
    } 
} 

答えて

5

.NETの型は、アセンブリによってスコープされます。インターフェイスが同じアセンブリにない限り、同じタイプではなく、そのように扱われません(キャストは失敗します)。

ですから、ここでプロジェクト間の参照が必要になります。最も一般的なのは、その中に共通の型とインタフェースを持つ3番目のdllだけです。あなたは(WCF経由など)二つの層の間の契約ベースのSOAを行っている場合

は例外です。しかし、私はこれがあなたが意図したものだとは思わない。

2

SQLバックエンドのIProductは、ERPバックエンドのものとは意味が異なります。したがって、同じインターフェイスを共有することはできません。

別々に、次いで予め定義されたフォーマットを使用し、両者を理解するクラスを使用してそれらの間でデータを渡す2つのバックエンドを実装します。そのクラスは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); 
       } 
     } 
} 
+0

コードはきれいにフォーマットされています:http://pastebin.com/f4bfe4a8c –

関連する問題