1

TableProfileProviderを使用して、n層アーキテクチャでASP.NETプロファイルシステムを使用しています。
UIレイヤーはWebアプリケーションであるため、プロファイルを使用できるようにするには、profilecommonクラスを公開する必要があります。
これが私のアーキテクチャの単純化されたスキーマです:
UI: ASP.NETWebアプリケーション。
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にアクセスします
。ProfileCommonstrongleyTypedProfile =(ProfileCommon)this.Context.Profile;

ビジネスロジックレイヤーからプロファイルコモンにアクセスできるようにしたいので、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();

さて、Business Layer / BusinessEntities Libraryで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、Webアプリケーションにインターフェイスを実装する自由があります。ProfileBase

于 2011-01-25T23:32:35.793 に答える