Ho cercato di implementare un'applicazione con accoppiamento lento in un'app MVC5 asp.net. Ho un regolatore:Come impedire l'uso improprio del costruttore in classe C#
public class HeaderController : Controller
{
private IMenuService _menuService;
public HeaderController(IMenuService menuService)
{
this._menuService = menuService;
}
//
// GET: /Header/
public ActionResult Index()
{
return View();
}
public ActionResult GetMenu()
{
MenuItem menu = this._menuService.GetMenu();
return View("Menu", menu);
}
}
E il servizio viene utilizzato in questo controller è:
public class MenuService : IMenuService
{
private IMenuRespository _menuRepository;
public MenuService(IMenuRespository menuRepository)
{
this._menuRepository = menuRepository;
}
public MenuItem GetMenu()
{
return this._menuRepository.GetMenu();
}
}
E il repository utilizzato nella classe di servizio è:
public class MenuRepository : IMenuRespository
{
public MenuItem GetMenu()
{
//return the menu items
}
}
Le interfacce utilizzate per il servizio e il deposito sono come tali:
public interface IMenuService
{
MenuItem GetMenu();
}
public interface IMenuRespository
{
MenuItem GetMenu();
}
Il costruttore per HeaderController
utilizza MenuService
utilizzando Iniezione costruttore e io ho ninject come contenitore DI che gestisce questo.
Tutto grandi opere - tranne che, nel mio controller, posso ancora fare questo:
MenuItem menu = new MenuService(new MenuRepository());
... che rompe l'architettura. Come posso evitare che il "nuovo" venga usato in questo modo?
Basta non fare quella? Non è sicuro il motivo per cui questo è più problematico del nominare il controller 'HeaderCantroller' "che rompe l'architettura" ... C'è una ragione particolare che stai cercando (come un particolare pattern che non può essere fermato con una buona nomenclatura/revisione del codice)? –
Non è possibile convalidare l'argomento all'interno del costruttore e generare un'eccezione se utilizzata in modo errato? –
@AlexeiLevenkov: l'utilizzo del costruttore viola direttamente la 'separazione delle preoccupazioni' e accoppia strettamente HeaderController a MenuService e MenuRepository. –