У меня возникла эта проблема:
Класс продукта в 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; }
}
}
Типы в .NET привязаны к их сборке. Если интерфейс не находится в одной и той же сборке, это не тот же тип и не будет рассматриваться как таковой (сбрасывание будет неудачным и т.д.).
Таким образом, вам будет нужна ссылка между проектами; чаще всего, к третьей dll, которая имеет только общие типы и интерфейсы.
Исключением является то, что вы выполняете SOA на основе контрактов между двумя уровнями (например, через WCF). Но я не думаю, что это то, что вы намеревались.
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);
}
}
}