接口架构设计建议

本文关键字:接口 | 更新日期: 2023-09-27 18:10:37

我有一个产品经理应用程序,我试图使用接口设计。产品可以是两种类型中的一种,打印或在线。我希望能够做通常的CRUD操作。我正在使用实体框架,但在构建接口时遇到了一个障碍。

例如,我为接口AddProduct(Product productToCreate)添加了我的第一个方法。由于我的实体来自实体框架,我该为产品使用什么类型?因此,我创建了一个名为Product的中间对象,将实体框架对象转移到其中,以便它可以适应接口。对吗?请建议。
class EFPrint
{
    //Entity Framework object
    public int PrintId { get; set; }
    public string Product { get; set; }
    public string Code { get; set; }
}
class EFOnline
{
    //Entity Framework object
    public int OnlineId { get; set; }
    public string Product { get; set; }
    public string Code { get; set; }
}
class Product
    {
    public int Id { get; set; }
    public string Product { get; set; }
    public string Code { get; set; }
    }
interface IProductManagerService
{
    void AddProduct(Product product);
}
class PrintService : IProductManagerService
{
    public void AddProduct(Product product)
    {
        throw new NotImplementedException();
    }
}
class OnlineService : IProductManagerService
{
    public void AddProduct(Product product)
    {
        throw new NotImplementedException();
    }
}

接口架构设计建议

实体框架允许你使用基类。你应该创建一个基本的Product类,让OnlineProduct和PrintProduct继承自Product:

public class Product { ... }
public class Online : Product { ... }
public class Print : Product { ... }

在您的DbContext中,您不应该为每种类型都使用DbSet,而应该为Product使用单个DbSet,并且只需添加访问器以便仅从特定类型检索产品:

public class ProductsContext : DbContext
{
    public DbSet<Product> Products { get; set; }
    public IQueryable<Online> OnlineProducts
    {
        get
        {
            return Products.OfType<Online>();
        }
    }
    public IQueryable<Print> PrintProducts
    {
        get
        {
            return Products.OfType<Print>();
        }
    }
}