将数据与代码分离

Decouple data from code

假设我的数据库中有一个名为 Couriers 的 table 和一个也称为 Couriers (DbContext.Couriers) 的 Entity Framework class,示例数据如下: 编号:1.名称:UPS 编号:2。名称:DHL

我用两个子类 CourierUPS 和 CourierDHL 扩展了这个 class,这两个子类都有一个名为 PrintSticker() 的新方法,它在 UPS 和 DHL 中是不同的(每个公司需要不同的贴纸格式)。

我还有一个视图,在 UPS 或 DHL 和调用 selected Courier 的 PrintSticker 方法的按钮之间 select。

嗯,问题是我可以用 IF 语句创建对象(if selectedCourier = "UPS" create new CourierUPS elseif selectedCourier = "DLH" create new CourierDHL... 这只是伪代码),但这不是一个好方法,因为如果我以后要创建 FedEx courier,我将需要更改那个 IF 语句,所以我认为我会变得一团糟。

我想实现的是一种动态获得的方法:

C#

CourierUPS courier = new CourierUPS;

VB.NET

Dim courier as CourierUPS = new CourierUPS

问题是:

1) 有没有一种简单的方法可以将class 的名称保存在table 中(CourierUPS、CourierDHL 等),并使用它来创建新对象的代码?

2) 有没有一种简单的方法动态构造class的名称,将快递公司(DHL或UPS)的名称附加到"Courier"字? Courier + UPS = CourierUPS,所以我们的代码将使用 class.

C# 或 VB.NET 解决方案都将受到赞赏。

谢谢

您可以尝试的选项是创建用于创建每种类型的工厂字典。

从这个开始:

var factory = new Dictionary<string, Func<Courier>>()
{
    { "UPS", () => new CourierUPS() },
    { "DHL", () => new CourierDHL() },
};

现在您可以像这样创建 "UPS" 或 "DHL" 信使:

var courier = factory["UPS"].Invoke();

但是,如果你现在想配置一个新的快递员,你可以将你的字典传递给一个可以添加 "FedEx" 的方法,你可以像这样添加它:

factory["FedEx"] = () => new CourierFedEx();

现在您可以在主代码中执行此操作:

var courier = factory["FedEx"].Invoke();

它很基本,但很管用。