Добавление ссылки System.Web на уровень бизнес-логики в n-слойной архитектуре - PullRequest
1 голос
/ 26 января 2011

Я использую 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-слоя? Если да, что бы вы предложили для достижения этой цели?

Ответы [ 2 ]

1 голос
/ 26 января 2011

Вы можете устранить зависимость от ProfileBase, реализовав вместо этого интерфейс. Скажем

public interface IProfile
{
    string FirstName { get; set; }
    string LastName { get; set; }

    IProfile GetProfile(string username);
}

public class ProfileCommon : ProfileBase, IProfile
 {
    public virtual IProfile GetProfile(string username)
    {
        return (ProfileCommon)ProfileBase.Create(username);
    }

    public virtual string FirstName
    {
        get
        {
            return (string)base.GetPropertyValue("FirstName");
        }
        set
        {
            base.SetPropertyValue("FirstName", value);
        }
    }
 }

public class ProfileInfo
{
    public ProfileInfo(IProfile profile)
    {
        this.Profile = profile;
    }

    public IProfile Profile { get; set; }

    public string GetFullName()
    {
        return this.Profile.FirstName + " " + this.Profile.LastName;
    }
} 

Теперь у вас нет зависимости от System.Web.dll в вашей бизнес-логике, но вы по-прежнему можете реализовать интерфейс IProfile в своем веб-приложении, используя ProfileBase

1 голос
/ 26 января 2011

Вы не должны обращаться к System.Web с бизнес-уровня.Это связывает вас с работой с веб-приложением.Что если вы хотите повторно использовать бизнес-уровень в другом приложении?

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

...