ウィンドウおよびWebベースのアプリケーションのビジネスロジックレイヤー設計に関する意見
-
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);
}
}
これが役立つことを願っています。