ご自身の質問に答えたと思いますが、使用しているプレゼンテーション層によって異なります。しかし、このビジネス レイヤーを一般的なものにしたい場合は、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);
}
}
これが役立つことを願っています。