ウィンドウおよびWebベースのアプリケーションのビジネスロジックレイヤー設計に関する意見

StackOverflow https://stackoverflow.com/questions/3785590

  •  05-10-2019
  •  | 
  •  

質問

Webベースのビジネスレイヤー機能の署名を選択することについての意見が必要です。

function void createUser(会社usercompany、string name ...)

また

function void createUser(int companid、string name ...)

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

しかし、一方で、これがWebベースのアプリケーションである場合、IDのみがクライアントサイトにロードされます。とにかくDabaseBaseでdabasebaseで保存されるため、会社のオブジェクトをロードすることは一種の冗長です。

うまくいけば、私の説明があまりにも混乱していません= P読んでくれてありがとう。

役に立ちましたか?

解決

あなたはあなた自身の質問に答えたと思います、それはあなたが使用しているプレゼンテーションレイヤーに依存します。ただし、このビジネスレイヤーを一般的に保ちたい場合は、IDを使用する必要があります。

これが別のアイデアです。私は個人的に、すべての変異をクラスに包むのが好きです。たとえば、 CreateUserCommand それはベースコマンドから継承します。これにより、このように使用することができます(ここでC#を想定しています):

var command = new CreateUserCommand();

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

command.Execute();

このロジックをコマンドに包むときは、非常に素晴らしいパターンです。単一のユースケースを単一のコマンドに配置できます。特に、コマンドのロジックの量が増えると、このパターンに感謝するでしょうが、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);
    }
}

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top