Ваш контекст данных принадлежит слою доступа к данным, если вы следуете подходу.Однако, в зависимости от того, как вы реализуете через чистую архитектуру (причудливая терминология для луковой архитектуры) или N-уровневую архитектуру.Эти два подхода предназначены для разделения задач, однако чистая архитектура часто даже более абстрактна и слабо связана, чем типичная архитектура N-уровня.
Основополагающий подход, хотя для ваших зависимостей N-уровня, будет следующим:
Уровень доступа к данным:
- Уровень домена (простые старые объекты C #)
Уровень обслуживания (необязательно):
- Уровень доступа к данным
- Уровень домена
Уровень представления:
Однако, если вы включите в среду, такую как Asp.Net Core, вы заметите, что ваше решение опирается на промежуточное ПО.Уровень представления для модуля, контроллера, просмотра всех находится в файле решения.Таким образом, непреднамеренно у вас будет уровень представления для обработки вашего UX, но вам потребуется IServiceCollection
, чтобы зарегистрировать эти другие зависимости, создавая слой в соответствии с:
Уровень представления:
- Уровень доступа к данным
- Уровень домена
- Уровень обслуживания
Это решит проблему циклической зависимости, но затем вам придется выбрать подход связывания.Но это самый распространенный и простой пример, который вы часто видите.
Уровень доступа к данным:
public interface ISampleRepository : IDisposable
{
IEnumerable<SampleModel> GetAllSamples();
}
public class SampleContext : ISampleRepository
{
public IEnumerable<SampleModel> GetAllSamples()
{
// Implementation
}
}
public interface ISampleFactory
{
ISampleRepository Create();
}
public class SampleFactory
{
ISampleRepository Create() => new SampleContext();
}
Уровень обслуживания:
public class SampleService
{
IEnumerable<SampleModel> RetrieveSamples()
{
using(var context = new SampleFactory().Create())
return context.GetAllSamples();
}
}
Уровень представления:
public class SampleController
{
public JsonResult Index() => new JsonResult(new SampleService().RetrieveSamples());
}
Вы можете использовать Dependency Injection или что-то еще, но это базовый подход, который поможет вам показать, как структура предназначена для работы внутри.Ни одно решение не является идеальным, выберите то, что соответствует требованиям вашего приложения, не добавляйте дополнительной сложности, если только оно не решает законную проблему, но, надеюсь, это поможет вам понять.