Проект ASP.Net, одна большая DLL и мое плохое дизайнерское решение - PullRequest
1 голос
/ 21 декабря 2009

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

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

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

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

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

Ответы [ 4 ]

3 голосов
/ 21 декабря 2009

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

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

1.) Application.Infrastructure

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

2.) Application.DataModel

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

3.) Application.DataAccess

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

4.) Application.DomainObjects

  • Бизнес-объекты и коллекции бизнес-объектов.
  • Перечисления.

5.) Application.BusinessLayer

  • Предоставляет классы менеджера, доступные на уровне презентации.
  • HttpHandlers.
  • Базовый класс моей собственной страницы.
  • Здесь все больше и больше ..

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

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

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

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

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

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

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

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

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)
    {
    }
}
2 голосов
/ 21 декабря 2009

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

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

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

2 голосов
/ 21 декабря 2009

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

1 голос
/ 21 декабря 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...