Dans mon application ASP.NET MVC, j'ai un projet qui contient toute la logique métier/couche de service. Ce projet interagit avec ma base de données (Entity Framework) qui se trouve dans un projet distinct. Je voulais un accès facile à la couche de service, j'ai donc créé des classes statiques pour pouvoir facilement les référencer. Par exemple, si je suis dans mon contrôleur et je dois créer un nouveau compte:Couche de service d'application en tant que classes statiques
ServiceLayer.Accounts.CreateAccount(userName, passWord) //etc..
La couche de service ne puis toute la logique nécessaire, puis crée l'utilisateur via le référentiel dans le 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);
}
Parce que je ne voulais pas faire ce qui suit partout dans ma couche de service:
AccountRepository Accounts = new DatabaseLayer.AccountRepository();
I au lieu de créer une classe wrapper pour mes référentiels pour que je ne l'instancier une fois à utiliser tous les autres dépôts.
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+)
}
Qui a été utilisé dans les classes statiques de la couche de service. Comme toutes les classes de ma couche de service sont statiques et que le champ Repos
est également statique, le problème évident que je rencontre est celui où le même objet est récupéré à partir de plusieurs bases de données, provoquant des comportements étranges pour les mises à jour/suppressions. Je comprends que cela est normal si j'utilise des membres/classes statiques comme je l'ai fait depuis le cycle de vie de l'application, mais est-il possible d'utiliser la couche de service comme ServiceLayer.Accounts.Method()
sans avoir à créer une classe non statique qui doit être instanciée partout où elle est utilisée et ne rencontre pas les problèmes CRUD dus à plusieurs instances datacontext?
"En fait, certaines des meilleures méthodes d'aide sont statiques" Quel est votre concept de "meilleur"? –