从代码中分离数据

时间:2015-02-25 07:30:43

标签: c# vb.net entity-framework decoupling

假设我的数据库中有一个名为Couriers的表,还有一个名为Couriers(DbContext.Couriers)的实体框架类,其示例数据为: Id:1。名称:UPS Id:2。姓名:DHL

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

我还有一个组合视图,可以选择UPS或DHL以及调用所选Courier的PrintSticker方法的按钮。

嗯,问题是我可以使用IF语句创建对象(如果selectedCourier =“UPS”创建新的CourierUPS elseif selectedCourier =“DLH”创建新的CourierDHL ...它只是伪代码),但它不是一个好方法,因为如果我想在未来创建FedEx快递,我将需要更改IF声明,所以我想我会变得一团糟。

我想要达到的目的是通过dinamycally获得这个:

C#

CourierUPS courier = new CourierUPS;

VB.NET

Dim courier as CourierUPS = new CourierUPS

问题是:

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

2)是否有一种简单的方法来动态构建类的名称,将快递(DHL或UPS)的名称附加到“Courier”字样? Courier + UPS = CourierUPS,所以我们的代码将使用该类。

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

谢谢

1 个答案:

答案 0 :(得分:2)

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

从这开始:

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

现在您可以创建&#34; UPS&#34;或者&#34; DHL&#34;快递是这样的:

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

但是,如果您现在想要配置一个新的快递,您可以将字典传递给可以添加&#34; FedEx&#34;的方法,您可以像这样添加它:

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

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

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

它是基本的,但它确实有效。

相关问题