1

我正在使用 TableProfileProvider 在 n 层架构中使用 ASP.NET 配置文件系统。
UI 层是一个 Web 应用程序,因此我必须公开 profilecommon 类才能使用配置文件。
这是我的架构的简化架构:
UI: ASP.NET Web 应用程序。
BusinessEntities:纯 POCO 类。坚持不懈。
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);
        }
    }
 }  

在一个简单的设计架构中,所有内容都在 Web 应用程序项目中定义,我将按如下方式访问 profilecommon:
ProfileCommon strongleyTypedProfile = (ProfileCommon)this.Context.Profile;

我希望能够从我的业务逻辑层访问 Profile Common,因此我将 ProfileCommon 定义移至我的 BusinessEntities 库(必须在 BusinessEntities 库中添加对 System.Web 程序集的引用)并定义了新的 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;
    }
}  

现在我可以像这样从 UI 访问常见的配置文件:

var profileInfo = new BLL.ProfileInfo((ProfileCommon)this.Context.Profile);
txtFullName.text = profileInfo.GetFullName();

现在,在业务层/业务实体库中引用 System.Web 是否违反了 n 层架构规则?如果是这样,您会提出什么建议来实现这一目标?

4

2 回答 2

1

您不应该从业务层访问 System.Web。这将您与使用 Web 应用程序联系起来。如果您想在不同类型的应用程序中重用业务层怎么办?

你应该问问自己你想通过这个来完成什么。然后,将该需求抽象为业务层可以访问的通用合理的东西。这假设业务层应该完全了解用户。

于 2011-01-25T23:14:24.047 回答
1

你可以通过实现一个接口来打破对 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

于 2011-01-25T23:32:35.793 回答