En mi aplicación ASP.NET MVC, tengo un proyecto que contiene toda la lógica de negocios/capa de servicio. Este proyecto interactúa con mi base de datos (Entity framework) que se encuentra en un proyecto separado.Capa de servicio de aplicación como clases estáticas
Quería acceder fácilmente a la capa de servicio, así que creé clases estáticas en ella para que puedan ser referenciadas fácilmente. Por ejemplo, si estoy en mi controlador y tengo que crear una nueva cuenta:
ServiceLayer.Accounts.CreateAccount(userName, passWord) //etc..
La capa de servicio, entonces no toda la lógica necesaria, a continuación, crea el usuario a través del repositorio en el DatabaseLayer
.
private static AllRepos _Repos;
private static AllRepos Repos {
get
{
if(_Repos == null)
_Repos = new AllRepos();
return _Repos
}
}
public static void CreateAccount(string username, password)
{
string salt = GenerateSalt();
Account newAccount = DatabaseLayer.Models.Account
{
Name = username,
Password = HashPassword(password, salt),
Salt = salt
};
Repos.AddAccount(newAccount);
}
Debido a que no quería hacer lo siguiente en todas partes en mi capa de servicio:
AccountRepository Accounts = new DatabaseLayer.AccountRepository();
en lugar de eso creado una clase contenedora para mis repositorios de manera que no tengo más que una instancia de una vez para usar todos los otros repositorios
public class AllRepos
{
private AccountRepository _Accounts;
public AccountRepository Accounts
{
get
{
if (_Accounts== null)
_Accounts= new AccountRepository();
return _Accounts;
}
}
// the same is done for every other repository (currently have about 10+)
}
Que se usó en las clases estáticas de la capa de servicio.
Dado que todas mis clases de capa de servicio son estáticas y el campo Repos
también es estático, el problema obvio que sigo encontrando es cuando el mismo objeto se recupera de múltiples contextos de datos causando comportamientos extraños para las actualizaciones/eliminaciones.
Entiendo que esto es de esperar si uso miembros/clases estáticos como lo hice, ya que duran el ciclo de vida de la aplicación, pero ¿hay alguna manera de poder utilizar la capa de servicio como ServiceLayer.Accounts.Method()
sin tener que crear una clase no estática que necesita ser instanciada donde sea que se use y no encontrarse con los problemas de CRUD debido a múltiples instancias de contextos de datos?
"de hecho, algunos de los mejores métodos de ayuda son estáticos" ¿Cuál es su concepto de "mejor"? –