Dictamen sobre diseño de la capa de lógica de negocio para la ventana y la aplicación basada en web

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

  •  05-10-2019
  •  | 
  •  

Pregunta

Necesito algunos comentarios sobre la elección de qué firmas para mi función de la capa de negocio basado en la web:

CreateUser función void (Compañía UserCompany, nombre de la cadena ...)

o

CreateUser función void (int CompanyID, nombre de la cadena ...)

Si se trata de una ventana basé yo elegiría función para tomar objeto en lugar de int porque desde que la compañía ya cargado a la forma de la ventana, ¿por qué no utilizarla. Además, creo que la capa de negocio debe tener objetos de negocio y su tipo de seguridad (prevención accidentalmente pasar en 0 ó -1).

Pero, por otro lado, si se trata de una aplicación basada en web, solamente Identificación será cargado a los sitios del cliente. Así que es un poco redundante a objeto de empresa de carga porque, al final sólo se guardará en el CompanyID dabasebase de todos modos.

Espero que mi descripción no es demasiado confuso = P Gracias por la lectura.

¿Fue útil?

Solución

creo que responde a su propia pregunta, depende de la capa de presentación que está utilizando. Pero cuando se quiere mantener esta capa de negocio genérico, que tendrá que ir con la ID.

Aquí hay otra idea. Personalmente, me gusta a envolver todas las mutaciones en clases, que llamo comandos. Se podría, por ejemplo, tener un CreateUserCommand que hereda de un comando de base. Esto le permitiría a utilizar de esta manera (estoy asumiendo C # aquí):

var command = new CreateUserCommand();

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

command.Execute();

Al envolver esta lógica en un comando es muy agradable patrón. Se le permite poner un solo caso de uso en un solo comando. Especialmente cuando la cantidad de lógica en un comando crece usted podrá apreciar este patrón, pero encontrado que es muy eficaz para las operaciones CRUD también.

Este patrón también le permite abstraer el modelo transaccional de distancia en la clase base. La clase base puede envolver una llamada para ejecutar una transacción en la base de datos. Aquí es una implementación sencilla:

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);
}

Y esto es lo que el CreateUserCommand se vería así:

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);
    }
}

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top