2009-12-21 2 views
1

Когда-то у меня был небольшой проект .net под названием Intranet. Он просто обслуживал веб-страницы и отображал некоторые данные, полученные из базы данных. Со временем монстр вырос из этого небольшого проекта .net. Я добавил различные панели мониторинга и функции отчетности и все, что было запрошено мной в то время. Теперь у меня большой проект .net, который слишком много происходит в одной DLL, чтобы эффективно и быстро реагировать на запросы управления.ASP.Net проект, одна большая dll и мое плохое дизайнерское решение

Например, если мне нужно быстро перейти к некоторой функциональности в одной логической области сайта, и я нахожусь в середине написания большей части функциональности для другой части веб-сайта, я застрял с мой intranet.dll не компилируется. Я знаю, что могу разделить свой исходный контроль, но то, что я хотел бы сделать, это иметь несколько DLL. Я бы хотел иметь одну логическую область функциональности.

Как я могу это сделать? Это ручной процесс создания каждого проекта и копирования кода? Я бы хотел иметь только один web.config для всего этого. Я также хотел бы иметь возможность использовать одного и того же поставщика членства для обработки всех проектов. Какие соображения мне нужно сделать на веб-сервере?

Любые предложения о том, как другие относятся к подобным вещам, были бы очень полезными.

Спасибо всем.

ответ

3

Вы можете начать повторное проектирование для высококлассного своего проект с более обслуживаемой архитектурой. И, конечно, это потребует времени и усилий, но в итоге вы получите отличные результаты.

Это то, что у меня есть в моем проекте.

1.) Application.Infrastructure

  • Базовые классы для всех BusinessObjects, Busines объект коллекции, классы доступа к данным, и мои собственные атрибуты и утилиты как методы расширения, общие рамки проверки. Это определяет общую организацию поведения моего последнего приложения .net.

2.) Application.DataModel

  • типизированных Dataset для базы данных.
  • TableAdapters расширены для включения транзакций и других функций, которые могут мне понадобиться.

3.) Application.DataAccess

  • классы доступа к данным.
  • Фактическое место, где действия базы данных запрашиваются с использованием базового набора типизированных данных.

4.) Application.DomainObjects

  • Бизнес-объекты и коллекции бизнес-объектов.
  • Enums.

5.) Application.BusinessLayer

  • Обеспечивает классы менеджер доступных из уровня представления.
  • HttpHandlers.
  • Мой собственный базовый класс.
  • Больше дела идут здесь ..

6.) Application.WebClient или Application.WindowsClient

  • Моя презентация слой
  • принимает ссылки от Application.BusinessLayer и применения. BusinessObjects.

Application.BusinessObjects используются по применению и они путешествуют во всех слоях, когда neeeded [за исключением Application.DataModel и Application.Infrastructure]

Все мои запросы определяются только Application.DataModel.

Приложение.DataAccess возвращает или принимает бизнес-объекты как часть любой операции доступа к данным. Бизнес-объекты создаются с помощью атрибутов отражения. Каждый бизнес-объект помечен сопоставлением атрибутов в целевой таблице в базе данных, а свойства в бизнес-объекте помечены сопоставлением атрибутов целевому coloumn в соответствующей таблице базы данных.

Моя система проверки позволяет мне проверять каждое поле с помощью назначенного параметра ValidationAttribute.

My framrwork сильно использует атрибуты для автоматизации большинства утомительных задач, таких как сопоставление и проверка. Я также могу добавить новую функцию в качестве нового аспекта.

Образец бизнес-объекта будет выглядеть так в моем приложении.

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

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

    /// <summary> 
    /// Initializes a new instance of the BookCollection class. 
    /// </summary> 
    public BookCollection (IList<Book> initialList) 
     : base(initialList) 
    { 
    } 
} 
+0

Если бы я мог заставить их остановить все новые разработки в течение следующих 3 недель или около того. Но это сработает. У меня может быть основной проект, который использует все мои функциональные области, разбитые на их собственные библиотеки классов. По крайней мере, это не должно быть так больно. – jim

+0

Ну, если у вас нет времени на сортировку .dlls, тогда почему бы вам не разветвить код?!?!? – Quibblesome

2

попробуйте добавить некоторые библиотеки классов проектов к вашему решению и переместить ваши коды библиотек ...

2

Похоже, у вас есть две проблемы здесь:

  1. Бедная общий дизайн, так что все код объединяется вместе.
  2. Не используйте ветвление в вашем поставщике управления источником.

Простое разделение кода (хотя и полезно) не решит проблему нарушения правил исправления в ходе новой разработки. Вам также нужно взглянуть на современный SCM (т. Е. Не VSS) и начать разветвление вашего кода - это имеет огромное значение.

1

Вы вызывающе хотите взглянуть на ветвление, даже если ваш код будет хорошо разбит, вы все равно будете иметь ту же проблему.

Мы работаем с 3-мя ветвями Dev, Test, Отпустите все новые функции, входящие в dev. Когда мы счастливы с ними, что они работают и готовы к тестированию, они идут на тестирование, и когда они будут протестированы, они могут пойти на выпуск, который является средой, которая идет к клиенту/развертывается.

Нет ничего, что мешало бы нам делать быстрые исправления в тесте и объединять их обратно в dev, а затем выпускать.

Я предлагаю вам посмотреть, что это называется модель продвижения кода управления источником.