Я разрабатываю маленькое приложение со структурой, ориентируемой на домен. Рисунок исходит из приложения предыдущего упражнения, которое было у главного файла MVC
что приходит как шаблон в .NET
.
Для этого упражнения я впитался во всю теорию, которая я смог, - Javero и нахожусь практик более потерянный на предприятии, что 7 шаров дракона. Я помещаю вас в песню немного чтобы видеть, можете ли вы ориентировать меня на шаги, которые я должен делать.
Я должен манипулировать двумя моделями, один Restaurante
и другой Valoraciones
. Мы предполагаем, что ресторана в условиях домена один AggregateRoot
. Рисунок этого приложения должен состоять из следующих характеристик:
MVC
)ApiWeb 2
+ MVC
.IoC
и UnityContainer
которые, поскольку они идут, но они не внедряются в реальном app.CodeFirst
. У меня есть слой инфраструктуры с библиотекой классов, но я не имею он ни разрабатывает как делать миграции.ORM
с Инфраструктуры.Расположение слоев, после того, как миллион руководителей видит каждый из Вашего отца и Ваша мать у меня остается такой:
Мы можем видеть, что Infraestructura
, в частности repositorio
согласись на домен, из которого я достаю интерфейсы. Aplicacion
согласись со ссылками в Dominio
и в infraestructura
с мыслью создавать объекты домена и делать инъекцию им в хранилище. И Presentacion
потрати Web Api
который я создам в будущем.
РЕСТОРАН
public class Restaurante : IAggregateRoot
{
public Restaurante()
{
Valoraciones = new HashSet();
}
public int RestauranteId { get; set; }
public string Name { get; set; }
public string City { get; set; }
public string Country { get; set; }
public double Avg { get; set; }
public virtual ICollection Valoraciones { get; set; }
//Aniadir valoracion nueva
public void AddValoration(Valoraciones v)
{
Valoraciones.Add(v);
AvgRefactor();
}
//Nota media
private void AvgRefactor()
{
Avg = this.Valoraciones.Average(e => e.Rating);
}
}
ОЦЕНКА
public class Valoraciones : IAggregateRoot
{
public int IdValoracion { get; set; }
public int Rating { get; set; }
public string Body { get; set; }
public string ReviewerName { get; set; }
public int RastauranteId { get; set; }
public virtual Restaurante Restaurante { get; set; }
}
ИНТЕРФЕЙС АТТАШЕ СИМПЛЕМЕНТЕ я стремлюсь к тому, чтобы пометить класс для того, чтобы она смогла быть использованной в хранилищах.
public interface IAggregateRoot
{
}
ИНТЕРФЕЙС ХРАНИЛИЩЕ
public interface IRepository where T : IAggregateRoot
{
//IUnitOfWork UnitOfWork { get; }
IQueryable AsQueryable();
IEnumerable GetAll(); //Recuperar todo
IEnumerable Find(Expression> esp);//Busqueda con Linq
T GetAll(Expression> esp); //Recuperar todo con Linq
T FindById(int? Id); //Buscar por ID
void Add(IAggregateRoot entidad);//Si no funciona cambiar IAgregateRoot por
void Update(IAggregateRoot entidad);//Actualiza
void Delete(IAggregateRoot entidad);//Elimina
void Save();//Guardar usando SaveChanges()
}
DB CONTEXT
public class ModelContext : DbContext
{
public ModelContext()
: base("name=ModelContext")
{
}
public virtual DbSet Restaurantes { get; set; }
public virtual DbSet ValoracionesRestaurantes { get; set; }
public static ModelContext Create()
{
return new ModelContext();
}
}
//Este metodo no se si va aqui, la aplicacion ha de implantar la autenticación
public class ApplicationUser : IdentityUser
{
public async Task GenerateUserIdentityAsync(UserManager manager)
{
// Tenga en cuenta que el valor de authenticationType debe coincidir con el definido en CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Agregar aquí notificaciones personalizadas de usuario
return userIdentity;
}
}
МОДЕЛИ EF6 CODE FIRST
Ресторан
public class Restaurante
{
public Restaurante()
{
Valoraciones = new HashSet();
}
[Key]
public int RestauranteId { get; set; }
[Required]
[Display(Name = "Nombre Restaurante")]
public string Name { get; set; }
[Required]
[Display(Name = "Ciudad")]
public string City { get; set; }
[Required]
[Display(Name = "País")]
public string Country { get; set; }
[Display(Name="Nota media")]
[DefaultValue(0)]
public double Avg { get; set; }
public virtual ICollection Valoraciones { get; set; }
}
ValoracionesRestaurante
public class ValoracionesRestaurante
{
[Key]
public int IdValoracion { get; set; }
[Range(0, 10)]
[Required]
[Display(Name = "Nota")]
public int Rating { get; set; }
[Required]
[Display(Name = "Comentario")]
public string Body { get; set; }
[Display(Name = "Nombre Crítico")]
[DefaultValue("Anonimo")]
public string ReviewerName { get; set; }
[Display(Name = "RestauranteRating")]
public int RastauranteId { get; set; }
public virtual Restaurante Restaurante { get; set; }
}
ХРАНИЛИЩЕ Остается осуществлять логику в методах. Доступ к DbContext это у меня есть как в примере Интернета, но я не думаю, что он действительный. Классы прибыли бы ко мне с Dominio
Где был бы должен делать mapeo?
public class Repositorio : dom.IRepository, IDisposable where T : dom.IAggregateRoot
{
private readonly DbContext _contexto;
//private ModelContext db = new ModelContext();
//Es posible que necesite una conexion por parametros
public Repositorio()
{
_contexto = new ModelContext() ;
}
public void Add(IAggregateRoot entidad)
{
if(_contexto.Entry(entidad).State != EntityState.Detached)
{
_contexto.Entry(entidad).State = EntityState.Added;
}
else
{
//db.Restaurantes.Add(Mapper.Map((dom.Restaurante)entidad));
_contexto.Set().Add(entidad);
}
}
public IQueryable AsQueryable()
{
throw new NotImplementedException();
}
public void Delete(IAggregateRoot entidad)
{
throw new NotImplementedException();
}
public void Dispose()
{
throw new NotImplementedException();
}
public IEnumerable Find(Expression> esp)
{
throw new NotImplementedException();
}
public T FindById(int? Id)
{
throw new NotImplementedException();
}
public IEnumerable GetAll()
{
throw new NotImplementedException();
}
public T GetAll(Expression> esp)
{
throw new NotImplementedException();
}
public void Save()
{
_contexto.SaveChanges();
}
public void Update(IAggregateRoot entidad)
{
throw new NotImplementedException();
}
}
MAPPING
class Mapping
{
public void CreateClassMap()
{
var config = new MapperConfiguration(cfg => {
cfg.CreateMap();
cfg.CreateMap();
cfg.CreateMap();
cfg.CreateMap();
});
}
}
Как я могу хранить правильно модели с хранилища? Я получаю классы, которые они внедряют IAggregateRoot
, я предполагаю, что будет нужно предохранять их mapeando от модели домена до одного EF6, и используя DbContext, чтобы хранить.
Как я делаю миграции? База данных все еще не была создана.
Каковы немного правила и следующие шаги, которые я должен делать в каждом из слоев, чтобы перемещать информацию и ее сохранять базу данных.
Спасибо и извините если бы лишенная информация или должны были быть очевидными какие-то вещи, я новый в.NET и прихожу из Java и кроме того - с двумя проектами. Уже они не дают мне вьючному седлу нейроны.