Я пытаюсь создать приложение в 3 слоя:
1) Уровень доступа к данным
2) бизнес-уровень
3) Пользовательский интерфейс
Я стараюсь не связывать классы, поэтому на бизнес-уровне я создал интерфейсы для классов доступа к данным, например:
public interface ICountryRepository:IRepository
{
Country GetCountry(int ID);
int CreateCountry(Country obj);
Boolean UpdateCountry(Country obj);
Boolean DeleteCountry(Country obj);
...
...
}
и я передаю интерфейс в качестве параметра конструктору службы:
public CountryService(ICountryRepository repository,ILanguageRepository lang_repository)
{
....
}
Но на CountryService, например, мне нужно загрузить текущего пользователя и его разрешения, чтобы я мог проверить, применима ли операция:
public Country GetCountry(int ID)
{
if securityService.UserHasPermission(currentUser, GetPermission("CanGetCountry"))
{
return repository.GetCountry(ID);
}
else
{
Throw(New SecurityException("No permissions for that operation ...."))
}
}
Это означает, что я должен создать экземпляр объекта SecurityDataAccess и передать его конструктору SecurityService в моей сборке бизнес-уровня, которую я стараюсь избегать для поддержания развязки объектов. Прямо сейчас у меня даже нет ссылки на какую-либо сборку DataAccess в моей бизнес-сборке.
Я думаю об использовании контейнера IoC здесь. Используя внешнюю конфигурацию, я мог получить правильный класс / сборку из файла конфигурации. Но я не уверен, что это правильное решение, потому что сказано, что контейнеры IoC должны использоваться в одном месте, чтобы все было просто, и большую часть времени это должна быть сборка верхнего уровня (сборка пользовательского интерфейса).
У кого-нибудь есть предложения по решению этой проблемы?