Удаление вызовов сеанса ASP.net из бизнес-логики - PullRequest
0 голосов
/ 04 февраля 2011

Я унаследовал веб-решение asp.net, которое имеет бизнес-логику и вызовы данных как отдельные сборки. На бизнес-уровне существует небольшое количество вызовов для получения / установки значений сеанса HttpContext. Я искал пример, который позволил бы мне абстрагироваться от бизнес-логики, поскольку я хотел бы иметь возможность повторно использовать эти сборки в не-веб-проектах, может кто-нибудь дать мне пример лучшего способа сделай это. Я думал о какой-то фабрике сессий, которая будет получать значения из некоторого постоянного хранилища в зависимости от сценария использования, но я действительно новичок в архитектуре и буду признателен за один или два указателя.

Ответы [ 3 ]

0 голосов
/ 04 февраля 2011

Я сделал что-то подобное в некоторых проектах:

public interface IAppContext {
    string SomeVariable {
        set;
        get;
    }
}
public class HttpContextAppContext : IAppContext {

    public static readonly string CONTEXT_PREFIX = "appcontext_";

    public string SomeVariable {
        set { HttpContext.Current.Session[CONTEXT_PREFIX + "SomeVariable"] = value; }
        get { return (string)HttpContext.Current.Session[CONTEXT_PREFIX + "SomeVariable"]; }
    }
}
0 голосов
/ 04 февраля 2011

Какой бизнес имеет бизнес-уровень с Session?Чтобы еще немного понять это утверждение, подумайте о нем следующим образом: зачем бизнес-уровню постоянно сохранять информацию, относящуюся к пользователю?

Бизнес-уровню необходимо работать с и обрабатывают данные, относящиеся к пользователю, но не сохраняют это.Это означает, что данные, которые хранятся в данный момент, должны быть введены, то есть они должны быть переданы в качестве параметра нужным функциям.Делая это таким образом, вы формируете архитектурный контракт, он говорит «эй, мне нужна эта пользовательская информация, чтобы выполнять свою работу» очень явным образом - вы не выполняете какое-то волшебство под капотом с некоторыми случайными ранее сохраненными значениями.Это нормально для бизнес-уровня, чтобы аутентифицировать или авторизовать пользователя каким-либо образом, используя эти данные, но он должен отбросить результаты аутентификации после того, как он закончил с ними.Если значения сохраняются для сохранения одного или двух вызовов в базе данных, у вас есть проблема с эффективностью вызовов базы данных, потому что вызовы базы данных для простых вещей, подобных этому, быстрые.

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

0 голосов
/ 04 февраля 2011

На мой взгляд, самый простой способ - создать интерфейс ISessionProvider с Dictionary<string, object> {get; }.Затем создайте public class HttpSessionProvider : ISessionProvider, который возвращает фактическое содержимое сумки сеанса.

По крайней мере, создайте экземпляр этого объекта в своем веб-приложении и передайте его классу бэкэнда, указав его вручную или используя любой шаблон IOC.

[Править] после небольшого размышления, это не чистый способ.У вас не будет зависимости от фреймворка asp.net, но вы все равно будете иметь доступное содержимое «asp.net» сеанса.В этом случае сохраните интерфейс, но либо добавьте определенные свойства (строка customer, int userID и т. Д.), Либо верните словарь только с фактическими бизнес-данными

...