Структура проекта корпоративной архитектуры с mvc и сервисом (.NET)
Я новичок в корпоративной архитектуре, но когда я правильно понимаю, она состоит из трех уровней. Я работаю над школьным проектом на платформе.net, и у меня есть такая структура:
- Уровень данных - библиотека классов с моделями данных, которые отображаются на реляционные базы данных
- Бизнес-уровень - библиотека классов, где у меня есть несколько классов, которые обеспечивают функциональность приложения
- Уровень представления - я думаю, что на этом уровне я мог бы проект MVC, но я не уверен.
Когда у меня есть такая структура, где я могу хранить некоторые веб-API или WCF? Может по праву на бизнес уровне? Или вы можете посоветовать мне, где я нашел реальный пример EA с сервисом и mvc? Спасибо
1 ответ
На самом деле у вас есть четыре слоя:
- презентация
- Сервисный уровень
- Уровень домена
- Уровень данных
Соглашение об именах может быть немного другим, но идея заключается в разделении принципалов. Идея, которая позволяет сервисному уровню выполнять бизнес-логику, но не знать о вызове метода уровня данных.
Таким образом, вы бы хотели ссылку как:
- Презентация - (ссылка на услугу, домен, данные)
- Уровень обслуживания - (эталонный домен, данные)
- Уровень домена - (без ссылки)
- Уровень данных - (эталонный домен)
Таким образом, ваш уровень представления будет ссылаться на все, поэтому, когда вы создаете свои контейнеры для инъекций зависимостей, вы можете правильно ссылаться на них.
Вы можете посмотреть на этот проект в качестве образца. О том, как взаимодействовать.
Презентация:
using Microsoft.AspNetCore.Mvc;
using Service_Layer;
namespace Address_Book.Controllers
{
[Route("api/[controller]")]
public class PeopleController : Controller
{
#region Dependencies:
private readonly IPeopleService peopleService;
#endregion
#region Constructor:
public PeopleController(IPeopleService peopleService)
{
this.peopleService = peopleService;
}
#endregion
[HttpGet]
public JsonResult Get()
{
var branches = peopleService.GetBranches();
return Json(branches);
}
[HttpGet("{id}")]
public JsonResult Get(int id)
{
var people = peopleService.GetEmployees(id);
return Json(people);
}
}
}
Уровень сервиса:
using Data_Layer.Factory;
using Domain_Layer.Entity;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
namespace Service_Layer
{
public class PeopleService : IPeopleService
{
private readonly IEmployeeFactory factory;
private const string getBranches = "...";
private const string getPeople = "..."
#region Constructor:
public PeopleService(IEmployeeFactory factory)
{
this.factory = factory;
}
#endregion
public IEnumerable<BranchModel> GetBranches()
{
using (var context = factory.Create())
return context.List<BranchModel>(getBranches, CommandType.Text);
}
public IEnumerable<EmployeeModel> GetEmployees(int branchId)
{
using (var context = factory.Create())
return context.List<EmployeeModel>(getPeople, CommandType.Text, new SqlParameter() { ParameterName = "BranchNum", SqlDbType = SqlDbType.Int, Value = branchId });
}
}
#region Declaration of Intent:
public interface IPeopleService
{
IEnumerable<BranchModel> GetBranches();
IEnumerable<EmployeeModel> GetEmployees(int branchId);
}
#endregion
}
Уровень данных:
using Data_Layer.Repository;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using Data_Layer.Helper;
namespace Data_Layer.Context
{
public class EmployeeContext : DbCommand, IEmployeeRepository
{
private bool disposed = false;
private string dbConnection;
#region Constructor:
public EmployeeContext(string dbConnection)
{
this.dbConnection = dbConnection;
}
#endregion
public IEnumerable<TEntity> List<TEntity>(string query, CommandType commandType, params SqlParameter[] parameters) where TEntity : class, new()
{
using (var connection = new SqlConnection(dbConnection))
using (var command = new SqlCommand(query, connection))
{
connection.Open();
command.CommandType = commandType;
foreach (var parameter in parameters)
command.Parameters.Add(parameter);
return BuildEntity(command, new TEntity());
}
}
#region Dispose:
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(true);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
disposed = true;
}
~EmployeeContext() { Dispose(false); }
#endregion
}
}
Вам нужно будет взглянуть на проект, уровень данных и уровень обслуживания вызываются через внедрение зависимостей, которое я создал для модуля расширения. Startup.cs
файл, но именно так они взаимодействуют. Если у вас есть какие-либо вопросы, не стесняйтесь задавать их, я ежедневно в чате C#.