Aktualna architektura aplikacji:
Domain (Modele domeny, EFDbContext)
Contracts (ViewModele i interfejsy Serwisów)
Application (implementacje Serwisów, w których korzystam z ORMa)
WebUI - projekt MVC
Nie korzystam ze wzorca repozytorium. Serwisy operują na EFDbContext.
WebUI ma w referencjach Contracts.
Powiedzmy, że w Contracts mam taki ViewModel:
public class RestaurantFormViewModel
{
// coś tam...
public SelectList AvailableCities { get; set; }
public IEnumerable<HttpPostedFileBase> FilesToUpload { get; set; }
}
SelectList wymaga referencji do System.Web.Mvc
HttpPostedFileBase wymaga referencji do System.Web
1. Czy projekty Contracts oraz Application powinny zawierać wyżej wymienione referencje?
2. Kolejne pytanie odnośnie Ninject, którego klasy znajdują się w projekcie WebUI.
kernel.Bind<IRestaurantService>().To<RestaurantService>();
wymaga referencji z WebUI do Application, czy ta referencja powinna mieć miejsce?
Jeżeli nie, to jak powinienem poradzić sobie z tym problemem?
Stworzyć oddzielny projekt dla DI?
3. Czy aktualna architektura aplikacji jest w porządku?
Czytając sobie inne tematy na forum, natknąłem się na informacje, że w Domain (o ile tak powinien nazywać się projekt zawierający klasy mapowane przez ORM na tabele bazy danych), nie powinno być DbContextu.
Powinienem zatem stworzyć nowy projekt DataAccess i tam wrzucić DbContext?
4. W projekcie korzystam z ASP.NET Identity, czy powinienem stworzyć dla tego oddzielny projekt Infrastructure,
i wrzucić do niego model ApplicationUser dziedziczący po IdentityUser (aktualnie znajduje się on w projekcie Domain)?
5. Powiedzmy, że mam ViewModel z następującą właściwością "Action":
public class RestaurantFormViewModel
{
public int RestaurantID { get; set; }
public string Action
{
get
{
Expression<Func<RestaurantController, ActionResult>> update = (c => c.UpdateRestaurant(this));
Expression<Func<RestaurantController, ActionResult>> create = (c => c.CreateRestaurant(this));
var action = (RestaurandID != 0) ? update : create;
return (action.Body as MethodCallExpression).Method.Name;
}
}
}
RestaurantForm.cshtml
@model Solution.Contracts.ViewModels.Restaurant.RestaurantFormViewModel
@using (Html.BeginForm(Model.Action, "Restaurant", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
}
dzięki której, widok RestaurantForm.cshtml może wywołać odpowiednią akcję z kontrolera Restaurant, a ja nie muszę robić dwóch widoków.
Wymaga jednak referencji z Contracts do WebUI...
Czy to rozwiązanie jest w ogóle poprawne, czy zrezygnować z niego i stworzyć oddzielne widoki dla NewRestaurant oraz EditRestaurant?