C# 将数据与代码分离

C# 将数据与代码分离,c#,vb.net,entity-framework,decoupling,C#,Vb.net,Entity Framework,Decoupling,假设我的数据库中有一个名为Couriers的表和一个名为Couriers(DbContext.Couriers)的实体框架类,其中包含以下示例数据: 身份证号码:1。姓名:UPS 身份证号码:2。姓名:DHL 我用两个子类CourierUPS和CourierDHL扩展了这个类,这两个子类都有一个名为PrintSticker()的新方法,这在UPS和DHL中是不同的(每个公司都需要不同的标签格式) 我还有一个视图,可以在UPS或DHL之间进行选择,还有一个按钮可以调用所选快递员的PrintStic

假设我的数据库中有一个名为Couriers的表和一个名为Couriers(DbContext.Couriers)的实体框架类,其中包含以下示例数据: 身份证号码:1。姓名:UPS 身份证号码:2。姓名:DHL

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

我还有一个视图,可以在UPS或DHL之间进行选择,还有一个按钮可以调用所选快递员的PrintSticker方法

好吧,问题是我可以用IF语句创建对象(IF selectedCourier=“UPS”create new CourierUPS elseif selectedCourier=“DLH”create new CourierDHL…这只是伪代码),但这不是一个好方法,因为如果我想在将来创建FedEx courier,我需要更改IF语句,所以我想我会变得一团糟

我想要实现的是一种平日生活方式:

C#

CourierUPS courier=新的CourierUPS

VB.NET

Dim courier as CourierUPS=新CourierUPS

问题是:

1) 是否有一种简单的方法将类的名称保存在表中(CourierUPS、CourierDHL等),并在代码中使用它来创建新对象

2) 是否有一种简单的方法可以动态构造类的名称,将courier(DHL或UPS)的名称附加到“courier”单词上?Courier+UPS=CourierUPS,因此我们的代码将使用该类

无论是C#还是VB.NET解决方案都会受到欢迎


谢谢

您可以尝试的选项是创建一个用于创建每种类型的factory字典

从以下几点开始:

var factory = new Dictionary<string, Func<Courier>>()
{
    { "UPS", () => new CourierUPS() },
    { "DHL", () => new CourierDHL() },
};
但是,如果您现在想要配置一个新的courier,您可以将字典传递到一个可以添加“FedEx”的方法中,您可以这样添加它:

factory["FedEx"] = () => new CourierFedEx();
现在,您可以在主代码中执行此操作:

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

它是基本的,但很有效。

抽象事实模式对我来说似乎是个不错的选择。您可以将
Activator.CreateInstance()
作为另一个选项。
var courier = factory["FedEx"].Invoke();