将数据与代码分离
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();
它很基本,但很管用。
假设我的数据库中有一个名为 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();
它很基本,但很管用。