ASP.NET и Рисунок, Ориентируемый на Домен

Я разрабатываю маленькое приложение со структурой, ориентируемой на домен. Рисунок исходит из приложения предыдущего упражнения, которое было у главного файла MVC что приходит как шаблон в .NET.

Для этого упражнения я впитался во всю теорию, которая я смог, - Javero и нахожусь практик более потерянный на предприятии, что 7 шаров дракона. Я помещаю вас в песню немного чтобы видеть, можете ли вы ориентировать меня на шаги, которые я должен делать.

Я должен манипулировать двумя моделями, один Restaurante и другой Valoraciones. Мы предполагаем, что ресторана в условиях домена один AggregateRoot. Рисунок этого приложения должен состоять из следующих характеристик:

  • Совещания в слое презентации (Он думал об одном MVC)
  • Веб Api. Здесь у меня есть проект с шаблоном ApiWeb 2 + MVC.
  • Индивидуальное удостоверение. Здесь не, как делание этого, так как логика идет как в слое презентации, так и в слое инфраструктуры.
  • Использовать IoC и UnityContainer которые, поскольку они идут, но они не внедряются в реальном app.
  • Модели, которые создают базу данных CodeFirst. У меня есть слой инфраструктуры с библиотекой классов, но я не имею он ни разрабатывает как делать миграции.
  • Хранилища, которые управляли бы о действиях ORM с Инфраструктуры.

Временная структура проекта

Расположение слоев, после того, как миллион руководителей видит каждый из Вашего отца и Ваша мать у меня остается такой:

introducir la descripción de la imagen aquí

Мы можем видеть, что Infraestructura, в частности repositorioсогласись на домен, из которого я достаю интерфейсы. Aplicacion согласись со ссылками в Dominio и в infraestructura с мыслью создавать объекты домена и делать инъекцию им в хранилище. И Presentacion потрати Web Api который я создам в будущем.

Классы Домена

РЕСТОРАН

public class Restaurante : IAggregateRoot
{
    public Restaurante()
    {
        Valoraciones = new HashSet<Valoraciones>();
    }
    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> 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<T> where T : IAggregateRoot
{
    //IUnitOfWork UnitOfWork { get; }
    IQueryable<T> AsQueryable();
    IEnumerable<IAggregateRoot> GetAll(); //Recuperar todo
    IEnumerable<IAggregateRoot> Find(Expression<Func<T, bool>> esp);//Busqueda con Linq
    T GetAll(Expression<Func<T, bool>> esp); //Recuperar todo con Linq
    T FindById(int? Id); //Buscar por ID
    void Add(IAggregateRoot entidad);//Si no funciona cambiar IAgregateRoot por <T>
    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<Restaurante> Restaurantes { get; set; }
    public virtual DbSet<ValoracionesRestaurante> 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<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> 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<ValoracionesRestaurante>();
    }
    [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<ValoracionesRestaurante> 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<T> : dom.IRepository<T>, 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<IAggregateRoot>(entidad).State != EntityState.Detached)
        {
            _contexto.Entry<IAggregateRoot>(entidad).State = EntityState.Added;
        }
        else
        {
            //db.Restaurantes.Add(Mapper.Map<dom.Restaurante, ent.Restaurante>((dom.Restaurante)entidad));
            _contexto.Set<IAggregateRoot>().Add(entidad);
        }
    }
    public IQueryable<T> AsQueryable()
    {
        throw new NotImplementedException();
    }
    public void Delete(IAggregateRoot entidad)
    {
        throw new NotImplementedException();
    }
    public void Dispose()
    {
        throw new NotImplementedException();
    }
    public IEnumerable<IAggregateRoot> Find(Expression<Func<T, bool>> esp)
    {
        throw new NotImplementedException();
    }
    public T FindById(int? Id)
    {
        throw new NotImplementedException();
    }
    public IEnumerable<IAggregateRoot> GetAll()
    {
        throw new NotImplementedException();
    }
    public T GetAll(Expression<Func<T, bool>> 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<ent.Restaurante, dom.Restaurante>();
            cfg.CreateMap<ent.ValoracionesRestaurante, dom.Valoraciones>();
            cfg.CreateMap<dom.Valoraciones, ent.ValoracionesRestaurante>();
            cfg.CreateMap<dom.Restaurante, ent.Restaurante>();
        });
    }
}

ВОПРОСЫ

Как я могу хранить правильно модели с хранилища? Я получаю классы, которые они внедряют IAggregateRoot, я предполагаю, что будет нужно предохранять их mapeando от модели домена до одного EF6, и используя DbContext, чтобы хранить.

Как я делаю миграции? База данных все еще не была создана.

Каковы немного правила и следующие шаги, которые я должен делать в каждом из слоев, чтобы перемещать информацию и ее сохранять базу данных.

Спасибо и извините если бы лишенная информация или должны были быть очевидными какие-то вещи, я новый в.NET и прихожу из Java и кроме того - с двумя проектами. Уже они не дают мне вьючному седлу нейроны.

9
задан 24.05.2019, 10:41
0 ответов