Один и тот же интерфейс в разных доменах / проекте

2

У меня возникла эта проблема:

Класс продукта в SQLBackend, который реализует интерфейс IProduct.

Я также получил продукт в 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; }
    }
}
Теги:
design-patterns
interface

2 ответа

5

Типы в .NET привязаны к их сборке. Если интерфейс не находится в одной и той же сборке, это не тот же тип и не будет рассматриваться как таковой (сбрасывание будет неудачным и т.д.).

Таким образом, вам будет нужна ссылка между проектами; чаще всего, к третьей dll, которая имеет только общие типы и интерфейсы.

Исключением является то, что вы выполняете SOA на основе контрактов между двумя уровнями (например, через WCF). Но я не думаю, что это то, что вы намеревались.

2

IProduct в исходном тексте SQL имеет другое значение, чем тот, что находится в back-end 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);
                }
        }
}
  • 0
    Код красиво отформатирован: pastebin.com/f4bfe4a8c

Ещё вопросы

Сообщество Overcoder
Наверх
Меню