Я использую TableProfileProvider для использования системы профилей ASP.NET в n-слойной архитектуре.
Слой пользовательского интерфейса - это веб-приложение, поэтому я должен предоставить класс profilecommon, чтобы иметь возможность использовать профили.
Вот упрощенная схема моей архитектуры:
Пользовательский интерфейс: Веб-приложение ASP.NET.
BusinessEntities: Чистые классы POCO. Стойкость Igronace.
BLL: Уровень бизнес-логики.
DAL: Уровень доступа к данным.
Определение Profilecommon:
public class ProfileCommon : ProfileBase
{
public virtual ProfileCommon GetProfile(string username)
{
return (ProfileCommon)ProfileBase.Create(username);
}
public virtual string FirstName
{
get
{
return (string)base.GetPropertyValue("FirstName");
}
set
{
base.SetPropertyValue("FirstName", value);
}
}
}
В простой архитектуре проектирования, где все определяется в проекте веб-приложения, я получаю доступ к профилю обыкновенно следующим образом:
ProfileCommon strongleyTypedProfile = (ProfileCommon) this.Context.Profile;
Мне бы хотелось иметь доступ к общему профилю из моего уровня бизнес-логики, поэтому я переместил определение ProfileCommon в свою библиотеку BusinessEntities (нужно было добавить ссылку на сборку System.Web в библиотеке BusinessEntities) и определил новый ProfileBLL Класс:
public class ProfileInfo
{
public ProfileInfo(ProfileCommon profile)
{
this.Profile = profile;
}
public ProfileCommon Profile { get; set; }
public string GetFullName()
{
return this.Profile.FirstName + " " + this.Profile.LastName;
}
}
Теперь я могу получить доступ к общему профилю из пользовательского интерфейса, например:
var profileInfo = new BLL.ProfileInfo((ProfileCommon)this.Context.Profile);
txtFullName.text = profileInfo.GetFullName();
Теперь, ссылка на System.Web в Business Layer / BusinessEntities Library нарушает дисциплины архитектуры n-слоя? Если да, что бы вы предложили для достижения этой цели?