我有一个包含所有数据库逻辑的类库.我的DAL/BLL.
我有一些Web项目将使用相同的数据库和类,所以我认为将数据层抽象到自己的项目中是一个好主意.
但是,当为某些项目的类添加功能时,我想向某些类添加方法.
例如,我的数据层有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 } }
使用相同的命名空间在单独的项目(创建依赖项)中编写部分类是一个好主意吗?如果这是一个坏主意,我怎样才能使这种类型的功能工作?
它似乎不想在编译时合并它们,所以我不确定我做错了什么.
您不能跨项目编写部分类.部分类是一个仅编译时间的语法糖 - 整个类型最终在一个程序集中,即一个项目.
(顺便说一下,你的原始DAL文件也必须声明该类是部分的.)
我无法回答关于组织图层的最佳方法的问题,但我可以尝试回答有关如何最好地模拟部分类的问题.
以下是一些想法:
首先想到的是继承.它不一定是最好的解决方案,但您可能没有选择,因为您可能需要能够像对象一样对待您的对象.
组合也是一个不错的选择(也就是说,将类包装在另一个类中).这使您可以更好地与DAL分离,但实现起来可能很繁琐.
如果您真的只需要在现有类中添加一个或两个方法,您可能还会考虑使用扩展方法,但如果您使用它们太多,这些方法可以快速创建意大利面条代码.
使用Visual Studio 2015及更高版本可以在项目之间拆分部分类:使用共享项目(另请参见此MSDN博客)。
对于我的情况,我需要满足以下条件:
一个类库,它定义了一些由多个客户端应用程序用作接口的类。
客户端应用程序。
安装程序在数据库中创建表。
由于安装程序的限制,这个设置必须是自包含的。它不能引用.NET框架以外的任何程序集。该设置应在表中插入一些枚举常量,因此理想情况下应引用类库。
安装程序可以导入共享项目。
由于共享项目类似于复制粘贴代码,因此我想尽可能少地移入共享项目。
下面的例子演示部分类和共享项目如何允许在不同的项目分割类。
在类库中,Address.cs:
namespace SharedPartialCodeTryout.DataTypes { public partial class Address { public Address(string name, int number, Direction dir) { this.Name = name; this.Number = number; this.Dir = dir; } public string Name { get; } public int Number { get; } public Direction Dir { get; } } }
类库是普通的Visual Studio类库。它导入SharedProject,除此之外,其.csproj不包含任何特殊内容:
Library
Address.Direction
在SharedProject中实现:
namespace SharedPartialCodeTryout.DataTypes { public partial class Address { public enum Direction { NORTH, EAST, SOUTH, WEST } } }
SharedProject.shproj是:
33b08987-4e14-48cb-ac3a-dacbb7814b0f 14.0
其.projitems为:
$(MSBuildAllProjects);$(MSBuildThisFileFullPath) true 33b08987-4e14-48cb-ac3a-dacbb7814b0f SharedProject
普通客户使用Address
包括Address.Direction
:
using SharedPartialCodeTryout.DataTypes; using System; namespace SharedPartialCodeTryout.Client { class Program { static void Main(string[] args) { // Create an Address Address op = new Address("Kasper", 5297879, Address.Direction.NORTH); // Use it Console.WriteLine($"Addr: ({op.Name}, {op.Number}, {op.Dir}"); } } }
常规客户端csproj引用类库而不是 SharedProject:
Exe {7383254d-bd80-4552-81f8-a723ce384198} SharedPartialCodeTryout.DataTypes
DbSetup仅使用枚举:
DbSetup.csproj没有引用类库。它只导入SharedProject:
Exe
结论:
您可以在项目之间划分局部类吗?
是的,使用Visual Studio的共享项目。
使用相同的名称空间在单独的项目中创建部分类(创建依赖项)是一个好主意吗?
通常不是(请参阅其他答案);在某些情况下,如果您知道自己在做什么,它会很方便。