Переопределение свойства в общем классе проекта

#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.