asp.net mvc - какой лучший способ для контроллеров делиться объектами - PullRequest
1 голос
/ 04 августа 2009

Я пытаюсь разделить некоторые объекты между несколькими контроллерами. какой лучший способ сделать это. я хочу избежать одиночных разрядов, и я хотел бы ввести их, если это возможно, но с asp.net mvc вы не «обновляете» контроллеры, поэтому любая помощь будет принята.

1 Ответ

2 голосов
/ 04 августа 2009

Позвольте мне сказать, что когда я начал работать с MVC, у меня была такая же проблема. Затем я узнал о контейнерах IoC (Inversion of Control) и Dependency Injection, так удивительно, как много вещей позволяют вам делать.

Этот проект объединяет Castle Windsor, NHibernate и ASP.NET MVC в одном пакете. http://code.google.com/p/sharp-architecture/

Если вы хотите сделать это самостоятельно, то можете выбрать свой любимый контейнер IoC. Есть некоторые привязки для MVC, или вы можете свернуть свои собственные. Если вы хотите сделать это самостоятельно, вам нужно реализовать IControllerFactory и настроить MVC на использование вашей фабрики. Вот мой.

public class ControllerFactory : IControllerFactory
{
    private readonly IDependencyResolver _controllerResolver;

    private RequestContext RequestContext { get; set; }

    public ControllerFactory(IDependencyResolver controllerResolver)
    {
        _controllerResolver = controllerResolver;
    }

    public void ReleaseController(IController controller)
    {
        _controllerResolver.Release(controller);

        var disposableController = controller as IDisposable;

        if (disposableController != null)
            disposableController.Dispose();
    }


    public IController CreateController(RequestContext requestContext, string controllerName)
    {
        Assert.IsNotNull(requestContext, "requestContext");
        Assert.IsNotNullOrEmpty(controllerName, "controllerName");

        RequestContext = requestContext;

        try
        {
            var controllerInstance = _controllerResolver.Resolve<IController>(controllerName.ToLower() + "controller");
            return controllerInstance;
        }
        catch(Exception ex)
        {
            throw new HttpException(404, ex.Message, ex);
        }
    }

}
...