0

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

+0

Какие значения хранятся в состоянии сеанса? –

+0

Сейчас просто сложный тип, содержащий данные пользователя и их разрешения на данные в виде списка Guid. –

ответ

-1

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

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

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

+0

При отражении вы правы, я не хочу сохранять значения в этом слое, я просто хочу, чтобы слой мог использовать данные, которые в настоящее время сохраняются в сеансе. В этом случае список Guid, сохраненный в сеансе, непосредственно отражается в базе данных, поэтому я могу получить его оттуда, если это необходимо. Я предполагаю, что я действительно хотел передать запрос на эти данные третьей стороне (фабрике сеансов), которая вернет мне список из наиболее подходящего места, которое, я думаю, будет сеансом при вызове из пользовательского интерфейса и базы данных если не. –

+0

Awesome ... я не против голосов, где это оправдано, но я бы ЛЮБЛЮ, чтобы быть образованным по моим ошибкам от человека, который проголосовал за это.Я не пропущу 2 пункта, это просто принципиальный вопрос. – slugster

0

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

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

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

0

я сделал что-то вроде этого на некоторых проектах:

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"]; } 
    } 
} 
Смежные вопросы