Позвольте мне сказать, что когда я начал работать с 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);
}
}
}