你应该跨项目使用部分类吗?
我有我所有的数据库逻辑的类库。 我的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那些。