Я думаю, что вы ответили на свой вопрос, это зависит от используемого вами уровня презентации. Но если вы хотите, чтобы этот бизнес-уровень был универсальным, вам придется использовать идентификатор.
Вот еще одна идея. Мне лично нравится заключать все мутации в классы, которые я называю командами. Например, вы можете иметь 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);
}
}
Надеюсь, это поможет.