1

Web ベースのビジネス層関数のシグネチャの選択について意見が必要です。

function void CreateUser(Company UserCompany, 文字列名...)

また

function void CreateUser(int CompanyID, string name...)

これがウィンドウ ベースの場合は、int の代わりにオブジェクトを取る関数を選択します。これは、会社が既にウィンドウ フォームにロードされているため、それを利用しない理由です。また、ビジネスレイヤーはビジネスオブジェクトを取得する必要があり、タイプセーフです(誤って0または-1を渡すのを防ぎます)。

一方、これが Web ベースのアプリケーションの場合、id のみがクライアント サイトに読み込まれます。したがって、会社のオブジェクトをロードするのはちょっと冗長です。最終的には companyID だけがデータベースに保存されるからです。

私の説明があまり混乱しないことを願っています =P 読んでくれてありがとう。

4

1 に答える 1

0

ご自身の質問に答えたと思いますが、使用しているプレゼンテーション層によって異なります。しかし、このビジネス レイヤーを一般的なものにしたい場合は、ID を使用する必要があります。

ここに別のアイデアがあります。私は個人的に、すべてのミューテーションをコマンドと呼ぶクラスにラップするのが好きです。CreateUserCommandたとえば、基本コマンドから継承する を使用できます。これにより、次のように使用できます(ここではC#を想定しています):

var command = new CreateUserCommand();

command.UserCompanyId = companyId;
command.UserName = name;

command.Execute();

このロジックをコマンドでラップすると、非常に優れたパターンになります。1 つのコマンドで 1 つのユース ケースを指定できます。特にコマンド内のロジックの量が増えると、このパターンが高く評価されますが、CRUD 操作にも非常に効果的であることがわかりました。

このパターンを使用すると、基本クラスでトランザクション モデルを抽象化することもできます。基本クラスは、データベース トランザクションで実行する呼び出しをラップできます。簡単な実装を次に示します。

public abstract class CommandBase
{
    public void Execute()
    {
        this.Validate();

        using (var conn = ContextFactory.CreateConnection())
        {
            conn.Open();
            using (var transaction = conn.BeginTransaction())
            {
                using (var db = ContextFactory.CreateContext(conn))
                {
                    this.ExecuteInternal(db);

                    db.SubmitChanges();
                }

                transaction.Commit();
            }
        }
    }

    protected virtual void Validate() { }

    protected abstract void ExecuteInternal(YourDataContext context);
}

そして、これは次のようにCreateUserCommandなります。

public class CreateUserCommand : CommandBase
{
    public int UserCompanyId { get; set; }
    public string UserName { get; set; }

    protected override void ExecuteInternal(YourDataContext context)
    {
       this.InsertNewUserInDatabase(context);
       this.ReportCreationOfNewUser();
    }

    protected override void Validate()
    {
        if (this.UserCompanyId <= 0) 
            throw new InvalidOperationException("Invalid CompanyId");
        if (string.IsNullOrEmpty(this.UserName))
            throw new InvalidOperationException("Invalid UserName");
    }

    private void InsertNewUserInDatabase(YourDataContext context)
    {
       db.Users.InsertOnSubmit(new User()
       {
          Name = this.UserName,
          CompanyId = this.CompanyId
       });
    }

    private void ReportCreationOfNewUser()
    {
        var message = new MailMessage();
        message.To = Configuration.AdministratorMailAddress;
        message.Body = "User " + this.Name + " was created.";

        new SmtpClient().Send(message);
    }
}

これが役立つことを願っています。

于 2010-09-24T10:50:16.793 に答える