Порядок имен в пространстве контроллера по умолчанию MVC C # - PullRequest
0 голосов
/ 18 мая 2018

Я разделил контроллеры и представления двух проектов на последней версии MVC 5.2.6

У нас есть много клиентских проектов с одним и тем же контроллером, но иногда нужно переопределять контроллеры.

Я хотел бы что-то сделатьНапример: контроллер по умолчанию в моем проекте библиотеки, но если мы нашли контроллер в основном проекте, возьмите этот, вид заказа для контроллеров.

Но когда я это сделаю:

ControllerBuilder.Current.DefaultNamespaces.Add("MainProject.Controllers");
ControllerBuilder.Current.DefaultNamespaces.Add("Library.Controllers");

, я получаюОшибка контроллера неоднозначна

Обновления

Идея состоит в том, чтобы иметь общие контроллеры для всех клиентских веб-сайтов.Веб-сайт клиента будет содержать только представления, но для определенных событий клиента потребуется переопределить некоторые контроллеры.

1 Ответ

0 голосов
/ 22 мая 2018

В моем примере у меня есть два одинаковых контроллера.Один в пространстве имен Core и один в клиенте:

namespace CustomControllerFactory.Core.Controllers
{
    public class DemoController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.CalledFrom = "Core";
            return View();
        }
    }
}

namespace CustomControllerFactory.Client.Controllers
{
    public class DemoController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.CalledFrom = "Client";
            return View();
        }
    }
}

. Для этого я создал фабрику пользовательских контроллеров:

public class CustomControllerFactory : IControllerFactory
{
    public IController CreateController(RequestContext requestContext, string controllerName)
    {
        var ns = MethodBase.GetCurrentMethod().DeclaringType.Namespace;
        var coreNs = $"{ns}.Core.Controllers";
        var clientNs = $"{ns}.Client.Controllers";

        //find out if core or client exists: /8388121/kak-proverit-suschestvuet-li-prostranstvo-imen-klass-ili-metod-v-c
        var coreControllers = (from assembly in AppDomain.CurrentDomain.GetAssemblies()
                               from type in assembly.GetTypes()
                               where type.Namespace == coreNs
                               select type);

        var clientControllers = (from assembly in AppDomain.CurrentDomain.GetAssemblies()
                                 from type in assembly.GetTypes()
                                 where type.Namespace == clientNs
                                 select type);

        Type controllerFullType = null;
        if (coreControllers.Any(x => x.Name == $"{controllerName}Controller"))
        {
            controllerFullType = Type.GetType($"{ns}.Core.Controllers.{controllerName}Controller");
        }
        else if (clientControllers.Any(x => x.Name == $"{controllerName}Controller"))
        {
            controllerFullType = Type.GetType($"{ns}.Client.Controllers.{controllerName}Controller");
        }
        else
        {
            throw new ApplicationException("no valid controller found");
        }

        IController controller = Activator.CreateInstance(controllerFullType) as Controller;
        return controller;
    }

    public SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName)
    {
        return SessionStateBehavior.Default;
    }

    public void ReleaseController(IController controller)
    {
        (controller as IDisposable)?.Dispose();
    }

}

. Это делает следующее:

  1. Проверьте, существует ли подходящий контроллер в пространстве имен ядра
  2. Проверьте, существует ли подходящий контроллер в пространстве имен клиента
  3. Если ни один из них не найден, выведите исключение (возможно, откатится назад?)
  4. Создайте Core, если он найден, иначе создайте клиентский контроллер

Затем вам нужно зарегистрировать свою фабрику в вашем global.asax:

ControllerBuilder.Current.SetControllerFactory(typeof(CustomControllerFactory));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...