#c# #inheritance #model-view-controller
#c# #наследование #модель-представление-контроллер
Вопрос:
Команда Ok,
Краткое изложение, чтобы вы поняли мой вопрос. У нас есть приложение MVC (Proj.MVC), которое ссылается на общий проект (Shared.MVC). Общий проект содержит контроллеры (BaseController amp; ApiController), контекст и диспетчер сеансов, поскольку они будут использоваться другими проектами. BaseController и ApiController имеют ссылку на SharedContext и SharedSessionManager.
Однако в некоторых проектах может потребоваться добавить дополнительные вызовы Context и Session Manager. Теперь моя проблема в том, что я могу использовать интерфейсы, чтобы новые классы в Proj.MVC могли заменять SharedContext на ProjContext, а любые унаследованные контроллеры могли менять тип контекста, но BaseController все еще использует SharedContext. Кроме того, все общие контроллеры используют SharedContext. Итак, теперь «новая» логика использует ProjContext amp; ProjSessionManager, в то время как вся общая логика использует SharedContext amp; SharedSessionManager.
Итак, мой вопрос. Как мне «принудительно» перенести projectcontext / Session на мой общий контроллер? Извлечение контроллеров в Proj.MVC сводит на нет повторное использование.
namespace Shared.MVC
{
public abstract class BaseMVCController: Controller
{
protected SharedContext DB;
protected SharedSessionManager SessionManager;
protected override void Initialize(RequestContext requestContext)
{
base.Initialize(requestContext);
DB = new SharedContext(); //This is being triggered on startup. Likely because HomeController inherits from BaseMVCController
SessionManager = new SharedSessionManager(DB);
}
}
public abstract class SharedApiController : ApiController
{
protected ISharedContext DB;
protected SharedSessionManager SessionManager;
protected override void Initialize(HttpControllerContext controllerContext)
{
base.Initialize(controllerContext);
DB = new SharedContext();
SessionManager = new SharedSessionManager(DB);
}
}
public class SharedSessionManager : ISessionManager
{
protected readonly ISharedContext DB;
public SharedSessionManager()
{
DB = new SharedContext();
}
public SharedSessionManager(ISharedContext myContext)
{
DB = myContext; //This is being called from the BaseMVCController.Initialize method
}
}
public class SharedContext : DbContext, ISharedContext
{
public SharedContext() : base("contextName")
{
}
public virtual DbSet<MyType> MyList { get; set;}
}
}
Комментарии:
1. После написания примера кода очень немногие люди поймут идею, которую вы объясняете.
2. Надеюсь, вышесказанное поможет. В основном все наши контроллеры наследуются от BaseMVCController. И все работает, пока мы используем базовый SharedContext / SharedSessionManager. В моем случае я хочу, чтобы Proj.MVC имел собственную реализацию обоих, и чтобы эти экземпляры были назначены BaseMVCController. Таким образом, все в моем проекте использует ProjContext / ProjSessionManager Тем не менее, я полностью осознаю (и согласен) тот факт, что все, что наследуется от BaseMVCController, будет ограничено методами, указанными в интерфейсе. Только Proj.MVC будет иметь доступ к дополнительным методам
3. вам необходимо переключиться с ручной инициализации контекста БД на внедрение зависимостей
4. Спасибо. Я начну изучать DI. Если у вас есть какие-либо рекомендуемые ссылки, я открыт для них. В противном случае я буду просматривать Google 🙂
5. Продолжение. Похоже, SharedSessionManager уже настроен для DI, но BaseMVCController является инжектором (эта часть хороша). Теперь, похоже, моя проблема в том, что BaseMVCController жестко настроен для использования SharedContext. Итак, у меня есть 2 вопроса. # 1 Как я могу изменить BaseMVCController. Инициализировать, чтобы разрешить внедрение конструктора (поскольку этот метод разрешает только RequestContext)? и # 2 Я пропустил это в своем предыдущем примере кода, но SharedContext также наследует сущность. DbContext. Итак, если я изменю BaseMVCController. DB для ISharedContext выдает ошибки везде, где используется метод DbContext.