你应该跨项目使用部分类吗?

我有我所有的数据库逻辑的类库。 我的DAL / BLL。

我有几个Web项目将使用相同的数据库和类,所以我认为将数据层抽象到自己的项目是一个好主意。

但是,当为某些项目的类添加function时,我想将方法​​添加到某些类中。

例如,我的数据层有Product和SomeItem对象:

// Data Access Layer project namespace DAL { public class Product { //implementation here } public class SomeItem { //implementation here } } 

在一个项目中,我想添加一个被不同内容项使用的接口,所以我有一个叫做:

 // This is in Web Project namespace DAL { public partial class Product : ICustomBehaviour { #region ICustomBehaviour Implementation TheSharedMethod(); #endregion } } 

在一个单独的项目中使用相同的命名空间编写一个分部类(创build一个依赖项)是一个好主意吗? 如果这是一个坏主意,我怎么能得到这种types的function工作?

它似乎并不想在编译时合并它们,所以我不知道我在做什么错误。

你不能在整个项目中编写分部类。 一个部分类是一个语法糖的编译时段 – 整个types最终在一个单一的程序集,即一个项目。

(顺便说一下,你原来的DAL文件也必须声明这个类也是部分的)。

我无法回答关于组织图层的最佳方法的问题,但我可以尝试回答有关如何最好地模拟部分类的问题。

这里有一些想法:

  • 首先想到的是inheritance。 这不一定总是最好的解决scheme,但是你可能没有select,因为你可能需要能够把你的对象像基类一样对待。
  • 作文也是一个不错的select(也就是把课堂包装在另外一个class级)。 这给你一个更好的解耦从你的DAL,但可以是繁琐的实施。
  • 如果你真的只需要添加一个或两个方法到现有的类,你也可以考虑使用扩展方法 ,但如果你使用它们,可以很快创build意大利面代码。

部分类必须存在于同一个程序集中。 否则,编译器将如何决定将哪些部分类合并到?

我看不出为什么这个计划不行:

两个文件包含存储机制(或其他function)。 它们指定inheritance,但不包含业务逻辑:

  • ProductDataAccess.cs
  • ProductWeb.cs

一个文件包含业务逻辑:

  • ProductBusinessLogic.cs

现在创build两个项目:

  • WebProject包含ProductWeb.cs和ProductBusinessLogic.cs。
  • DataProject包含ProductDataAccess.cs和ProductBusinessLogic.cs

两个项目都使用相同的业务逻辑。

我同意Jon Skeet的回答。

无论如何,我认为这不是一个好的select。 现在已经有很好的devise模式,这些模式已经certificate了分离代码层次的最好方法,而这只是一个小小的语法糖,因此微软可以将WinForms / WebFormsdevise器文件分开,并防止人们破坏它们。

虽然我同意Neil谈到pre-linq开发,但我也希望能够做到这一点,以便将Linq2SQLdevise者生成的部分类的商业逻辑分离出来。 例如:

 Northind.DAL (prj) -NorthindDataContext (EntityNamespace set to "Northwind.BLL") --Product() (Entity, partial class auto-generated) --Category() (Entity, partial class auto-generated) --Supplier() (Entity, partial class auto-generated) Northind.BLL (prj) -Product() : IMyCustomEnityInterface, BaseEntity (override OnValidate(), etc) -Category() : IMyCustomEnityInterface, BaseEntity (override OnValidate(), etc) -Supplier() : IMyCustomEnityInterface, BaseEntity (override OnValidate(), etc) 

不幸的是,我们不能这样做…实际上,我很想知道使用LINQ时分层/分层的推荐方式。

不。你不能在不同的项目中编写部分类。因为编译器一次只能编译一个项目,所以只能在那个项目中扫描类,方法,字段等列表。所以如果你有部分类的一部分其他项目,编译器不能find那些。