В моем приложении ASP.NET MVC у меня есть проект, который содержит всю бизнес-логику / сервисный уровень.Этот проект взаимодействует с моей базой данных (платформой Entity), которая находится в отдельном проекте.
Мне нужен легкий доступ к уровню обслуживания, поэтому я создал в нем статические классы, чтобы на них можно было легко ссылаться.Например, если я в своем контроллере и мне нужно создать новую учетную запись:
ServiceLayer.Accounts.CreateAccount(userName, passWord) //etc..
Служебный уровень затем выполняет всю необходимую логику, а затем создает пользователя через репозиторий в 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);
}
Поскольку я не хотел делать следующее повсюду на своем уровне обслуживания:
AccountRepository Accounts = new DatabaseLayer.AccountRepository();
Вместо этого я создал класс-обертку для своих репозиториев, так что мне нужно толькосоздайте его один раз, чтобы использовать все остальные репозитории.
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+)
}
, который использовался в статических классах уровня обслуживания.
Поскольку все мои классы уровня обслуживания являются статическими, а Repos
Поле также является статическим, очевидная проблема, с которой я постоянно сталкиваюсь, это когда один и тот же объект извлекается из нескольких точек данных, вызывающих странное поведение при обновлении / удалении.
Я понимаю, что этого следует ожидать, если я буду использовать статические члены / классы, как я делал, так как они имеют последний жизненный цикл приложения, но есть ли возможность использовать уровень обслуживания как ServiceLayer.Accounts.Method()
без необходимости создания нестатического класса, который необходимо создавать везде, где он используется, и не сталкиваться с проблемами CRUD из-за нескольких экземпляров datacontext?