2011-03-24 113 views
0

我的ASP.NET MVC Web应用程序被分割这样的:共享域逻辑

Web Application Layer 
    Views 

Domain Layer 
    Repository 
    [Repository and Interfaces here] 
    Domain 
    [Domain Classes here] 

这是相当新的,不断发展的,而我开始看到它的一些问题。我的域类是POCO对象 - 我使用Linq to SQL“Code First”,因此我添加了自己的类并装饰它们以在存储库中与它们一起使用。起初,这很顺利,我可以将商业/领域逻辑添加到类中,看起来很干净。

最近,我创建了许多基于相同的“核心”表 - “设备”表的数据库视图。我为每个视图创建一个POCO域类,以便我可以在我的Repoisitory中读取它。我遇到的麻烦是,添加到核心设备域类的域逻辑不适用于我的新视图。我无法使用公共基类,因为如果您使用属性来装饰类,则Linq to SQL不适用于此类。不使用视图不是一种选择,因为它们在Web应用程序之外也很有用。

有没有一个很好的解决方案,我想知道如果我可能需要考虑从单独的“域类”集合中分离存储库的类来解决这个问题?

[编辑]更多信息按要求。 例如,我的“设备”类,(这是映射到数据库中的域类)包含以下代码:

public string EquipmentDescription 
     { 
      get 
      { 
       return String.Format("U{0}{1}{2}", 
             String.Format("{0}", UPos.ToString("00")), 
             String.IsNullOrEmpty(EquipmentName) ? "" : ": " + EquipmentName, 
             String.IsNullOrEmpty(Label) ? "" : " - " + Label 
             ); 
      } 
     } 

现在,我已经在所谓的“EquipmentWithCableDetails”的数据库,其中包含一个视图有关设备细节的其他有用信息 - 所以我创建了一个类来为该视图建模(以便能够从中读取)。在代码中我使用了这个新类,我想显示EquipmentDescription - 但该属性只存在于Equipment类中。

谢谢!

+0

你有没有尝试使你的域类作为部分类?在两个地方定义。 – 2011-03-24 10:26:56

+0

不要认为这有帮助 - 我可能有3个类 - “EquipmentView1”,“EquipmentView2”,“EquipmentView3”,它们不是全部相同的类 - 但它们具有共同的核心功能 – 2011-03-24 10:59:09

+0

您可以举一个例子或两个你正在谈论的域逻辑类型? – 2011-03-24 17:05:21

回答

0

在类之间共享逻辑时可以使用的一种模式是帮助程序模式。

所有的类都可以调用他们需要访问域逻辑的帮助器。

有时,辅助模式被认为是反模式,但在你的情况下,它不可能放在基类中。

http://blogs.msdn.com/b/nickmalik/archive/2005/09/06/461404.aspx

+0

这对我来说是最好的解决方案,除了重构我的数据库以使我摆脱这种情况;) – 2011-05-12 10:46:05

1

我所做的就是把我的部分类/实体类/域类在一个单独的项目,这样一来所有的项目,包括测试项目可以参考一下这个项目。我发现这对我非常有用,您可以像您一样将所有的数据访问逻辑和业务逻辑留在您的域中。

+0

这是很好的一般性建议,但它并不能真正解决问题。有。 – 2011-04-05 10:18:16