【发布时间】:2011-08-15 00:14:12
【问题描述】:
这可能是一个奇怪的问题,而我现在所拥有的东西现在可以工作,但我觉得有点奇怪,我想知道这是因为设计/架构糟糕。如有任何想法,我们将不胜感激。
最初的设计是在我从别人那里继承的代码库中。我们有一个 linq-to-sql 类(在 dbml 的设计器文件中自动生成)。
[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.ARCustomers")]
public partial class ARCustomer : INotifyPropertyChanging, INotifyPropertyChanged
{
// variables
// extensibility method defs
// ctor
// properties
// etc.
}
然后是另一个名为ArCustomer(注意小写“r”)的类类,它是自动生成类的扩展版本。当我说扩展时,我的意思是它具有 LINQ 类的所有属性,再加上一些需要一些逻辑来填充的属性。
在代码中有很多地方我们想要将ARCustomer 转换为ArCustomer。所以我在ArCustomer 类上写了一个扩展方法(这感觉很奇怪)。
public static ArCustomer FromDatacontextObject(this ArCustomer customer, ARCustomer datacontextObject)
{
var arCustomer = new ArCustomer();
arCustomer.Id = datacontextObject.ProjectID;
// more of the same
// now populate the other fields that don't exist on the datacontextObject
return arCustomer;
}
就是这么称呼的。
var customerfromDb = accountReceivableRepository.GetCurCustomer(arId);
ArCustomer customer = new ArCustomer();
customer = customer.FromDatacontextObject(customerfromDb);
这对我来说感觉不对,但我不知道有什么更好的选择。 (包含扩展属性的部分类会起作用吗?将它们填充到它的构造函数中?)或者也许它很好......我对一些东西感兴趣......
- 我觉得这是错误的/奇怪的/不好的吗?
- 具体来说,我实施的解决方案有哪些缺点?我觉得其中一个原因是我经常挠头,试图区分这两个类并弄清楚哪个是哪个。
- 他们有什么优点吗?
- 有更好的解决方案(以及为什么更好)?
(不相关-我希望这种问题对于堆栈溢出是可以的。我几乎觉得我在要求进行迷你代码审查,这可能是主观的;另一方面,我试图问一些具体的问题和觉得我一定不是唯一遇到这种情况的开发人员(“我有一个对象,需要把它变成另一个对象”),所以希望通过让线程保持打开状态能有所收获)。
谢谢大家!
【问题讨论】:
标签: c# linq-to-sql architecture extension-methods object-model