【发布时间】:2013-06-29 15:05:52
【问题描述】:
假设我有一个来自第 3 方的类,它是一个数据模型。它可能有 100 个属性(一些具有公共设置器和获取器,其他具有公共获取器但私有设置器)。我们将这个类称为 ContosoEmployeeModel
我想用一个接口(INavigationItem,它具有 Name 和 DBID 属性)来装饰这个类,以允许它在我的应用程序中使用(它是一个 PowerShell 提供程序,但现在这并不重要)。但是,它还需要可用作 ContosoEmployeeModel。
我的初始实现如下所示:
public class ContosoEmployeeModel
{
// Note this class is not under my control. I'm supplied
// an instance of it that I have to work with.
public DateTime EmployeeDateOfBirth { get; set; }
// and 99 other properties.
}
public class FacadedEmployeeModel : ContosoEmployeeModel, INavigationItem
{
private ContosoEmployeeModel model;
public FacadedEmployeeModel(ContosoEmployeeModel model)
{
this.model = model;
}
// INavigationItem properties
string INavigationItem.Name { get; set;}
int INavigationItem.DBID { get; set;}
// ContosoEmployeeModel properties
public DateTime EmployeeDateOfBirth
{
get { return this.model.EmployeeDateOfBirth; }
set { this.model.EmployeeDateOfBirth = value; }
}
// And now write 99 more properties that look like this :-(
}
但是,很明显,这将涉及编写大量样板代码来公开所有属性,如果可以的话,我宁愿避免这样做。我可以在部分类中 T4 代码生成此代码,如果没有更好的想法,我会这样做,但我想在这里问是否有人使用一些 super wizzy @ 有更好的想法C#魔法之987654323@
请注意 - 我用来获取 ContosoEmployeeModel 的 API 只能返回一个 ContosoEmployeeModel - 我不能扩展它来返回一个 FacededEmployeeModel,所以包装模型是我能想到的唯一解决方案 - 我很高兴成为不过更正了:)
【问题讨论】:
-
使用AutoMapper怎么样?
-
我很困惑 - 你从
ContosoEmployeeModel继承你的外观类 并且 你有一个ContosoEmployeeModel通过合成嵌入到你的外观中?为什么? -
@MatthewWatson Oooh - 我从没听说过。这看起来很有希望 - 我会尝试并回帖
-
@RB。 :在这种情况下,Resharper 的委派成员功能就是您要寻找的机器人。 jetbrains.com/resharper/webhelp/… ... 非常适合生成外墙/代理。
标签: c# design-patterns adapter .net-4.5 facade