ASP.Net项目,一个大dll和我糟糕的设计决定

曾几何时,我有一个名为Intranet的.net项目。 它只是提供网页,并显示从数据库中检索的一些数据。 随着时间的推移,一个怪物已经从这个小小的.net项目中长大。 我添加了不同的仪表板和报告function,以及当时我要求的其他任何内容。 现在我有一个很大的.net项目,在一个dll中进行了太多的工作,以便有效和快速地响应管理请求。

例如,如果我需要对站点的一个逻辑区域中的某些function进行快速更改,并且我正在为网站的另一部分编写更大的function,那么我会被我的intranet.dll困住没有编译。 我知道我可以分支我的源代码控制,但我想做的是有多个dll。 我希望每个逻辑function区域都有一个。

我怎样才能做到这一点? 它是创建每个项目和复制代码的手动过程吗? 我想整个事情只有一个web.config。 我还希望能够使用相同的成员资格提供程序处理所有项目。 我需要在Web服务器上做出哪些考虑?

关于别人如何处理这类事情的任何建议都会非常有帮助。

感谢大家。

您可以开始重新设计以使用更易维护的架构来升级您的项目。 当然,这需要时间和精力,但最终你会有很好的结果。

这就是我在项目中所拥有的。

1.) Application.Infrastructure

  • 所有业务对象的基类,业务对象集合,数据访问类以及我的自定义属性和实用程序作为扩展方法,通用validation框架。 这决定了我最终的.net应用程序的整体行为组织。

2.) Application.DataModel

  • 数据库的类型化数据集。
  • TableAdapters扩展到包含我可能需要的事务和其他function。

3.) Application.DataAccess

  • 数据访问类。
  • 使用基础类型化数据集查询数据库操作的实际位置。

4.) Application.DomainObjects

  • 业务对象和业务对象集合。
  • 枚举。

5.) Application.BusinessLayer

  • 提供可从Presentation层访问的管理器类。
  • HttpHandlers的。
  • 我自己的Page基类。
  • 更多的事情去这里..

6.) Application.WebClientApplication.WindowsClient

  • 我的表示层
  • 从Application.BusinessLayer和Application.BusinessObjects获取引用。

Application.BusinessObjects在整个应用程序中使用,并且每当需要时它们都会遍历所有层[Application.DataModel和Application.Infrastructure除外]

我的所有查询都只定义了Application.DataModel。

Application.DataAccess返回或接受Business对象作为任何数据访问操作的一部分。 业务对象是在reflection属性的帮助下创建的。 每个业务对象都标记有一个属性映射到数据库中的目标表,业务对象中的属性使用映射到相应数据库表中的目标列的属性进行标记。

我的validation框架允许我在指定的ValidationAttribute的帮助下validation每个字段。

我的framrwork大量使用Attributes来自动执行大多数繁琐的任务,如映射和validation。 我还可以将新function作为框架中的新方面。

在我的应用程序中,示例业务对象将如下所示。

User.cs

[TableMapping("Users")] public class User : EntityBase { #region Constructor(s) public AppUser() { BookCollection = new BookCollection(); } #endregion #region Properties #region Default Properties - Direct Field Mapping using DataFieldMappingAttribute private System.Int32 _UserId; private System.String _FirstName; private System.String _LastName; private System.String _UserName; private System.Boolean _IsActive; [DataFieldMapping("UserID")] [DataObjectFieldAttribute(true, true, false)] [NotNullOrEmpty(Message = "UserID From Users Table Is Required.")] public override int Id { get { return _UserId; } set { _UserId = value; } } [DataFieldMapping("UserName")] [Searchable] [NotNullOrEmpty(Message = "Username Is Required.")] public string UserName { get { return _UserName; } set { _UserName = value; } } [DataFieldMapping("FirstName")] [Searchable] public string FirstName { get { return _FirstName; } set { _FirstName = value; } } [DataFieldMapping("LastName")] [Searchable] public string LastName { get { return _LastName; } set { _LastName = value; } } [DataFieldMapping("IsActive")] public bool IsActive { get { return _IsActive; } set { _IsActive = value; } } #region One-To-Many Mappings public BookCollection Books { get; set; } #endregion #region Derived Properties public string FullName { get { return this.FirstName + " " + this.LastName; } } #endregion #endregion public override bool Validate() { bool baseValid = base.Validate(); bool localValid = Books.Validate(); return baseValid && localValid; } } 

BookCollection.cs

 ///  /// The BookCollection class is designed to work with lists of instances of Book. ///  public class BookCollection : EntityCollectionBase { ///  /// Initializes a new instance of the BookCollection class. ///  public BookCollection() { } ///  /// Initializes a new instance of the BookCollection class. ///  public BookCollection (IList initialList) : base(initialList) { } } 

尝试将一些类库项目添加到您的解决方案并将您的代码移动到库…

听起来你有两个问题:

  1. 整体设计不佳,所以所有代码都集中在一起。
  2. 在源代码管理提供程序中不使用分支。

简单地将代码拆分(虽然有用),但不能解决在新开发过程中修改的问题。 您还需要查看现代SCM(即非VSS)并开始分支您的代码 – 它会产生巨大的差异。

你挑衅地想要分支,即使你的代码很好地分裂你仍然会有效地遇到同样的问题。

我们经营3个分支开发,测试,发布所有进入开发的新function。 当我们对他们感到高兴,他们工作并准备好进行测试时,他们会去测试,当他们经过测试时,他们可以去发布哪个是客户/部署的环境。

没有什么能阻止我们在Test中快速修复它们并将它们合并回dev然后发布。

我建议你看看它被称为源代码控制的代码促销模型。