In meiner ASP.NET MVC-Anwendung habe ich ein Projekt, das die gesamte Geschäftslogik/Serviceschicht enthält. Dieses Projekt interagiert mit meiner Datenbank (Entity-Framework), die sich in einem separaten Projekt befindet.Anwendungsdienstschicht als statische Klassen
Ich wollte einfachen Zugriff auf die Service-Schicht, also habe ich statische Klassen in ihm erstellt, so dass sie leicht referenziert werden können. Zum Beispiel, wenn ich in meinem Controller bin und ich brauche ein neues Konto zu erstellen:
ServiceLayer.Accounts.CreateAccount(userName, passWord) //etc..
Die Service-Schicht dann nicht all erforderliche Logik, erstellt dann den Benutzer über das Repository in den 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);
}
Da wollte ich nicht die folgenden überall in meiner Dienstschicht tun:
AccountRepository Accounts = new DatabaseLayer.AccountRepository();
ich eine Wrapper-Klasse für meine Repositorys stattdessen erstellt, so dass ich es nur einmal zu instanziiert zu verwenden alle anderen Repositories.
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+)
}
Die in den statischen Klassen der Service-Schicht verwendet wurde.
Da alle meine Service-Layer-Klassen statisch sind und das Repos
-Feld auch statisch ist, ist das offensichtliche Problem, das ich immer wieder vorfindet, wo das gleiche Objekt aus mehreren Datenkontexten abgerufen wird, seltsames Verhalten für Updates/Löschungen.
Ich verstehe, dass dies zu erwarten ist, wenn ich statische Mitglieder/Klassen verwenden, wie ich seit dem Lebenszyklus der Anwendung, aber gibt es eine Möglichkeit, die Service-Schicht als ServiceLayer.Accounts.Method()
zu verwenden, ohne zu erstellen eine nicht statische Klasse, die überall dort instanziiert werden muss, wo sie verwendet wird, und die CRUD-Probleme aufgrund mehrerer Datenkontextinstanzen nicht auftreten?
"tatsächlich sind einige der besten Hilfsmethoden statisch" Was ist Ihr Konzept von "best"? –