我正在关注 Steven Sanderson 和 Adam Freeman 的“ASP.Net MVC 3”,他们曾一度定义ControllerFactory
. 暴露的接口用于创建控制器,注入其中的(如提供数据的类)是黑盒(用于外部世界)。
我在这一点上,我真的不想获得任何控制器,而是控制器的绑定集——即提供数据的类。
我可以为控制器工厂添加另一种方法(如GetBinding
),它会起作用,但这是正确的方法吗?
只是为了专注于某事。我有IDataProvider
两个课程——MockupProvider
和ProviderForReal
。我想设置一次,现在只要我需要IDataProvider
我就会得到MockupProvider
。这是(由我)在控制器工厂中设置的。
而且我想以最优雅的方式检索我设置的内容,因此我不会再次绑定接口类。将这种方法添加GetBinding
到控制器因素中是一种好的模式吗?
我不是在构建控制器,我需要绑定控制器使用。
换句话说...
有控制器厂。里面定义了一些绑定。我必须使用检索它们(绑定,而不是控制器)。从技术上讲,我可以通过多种方式做到这一点:
查看代码,查看特定绑定,然后在其他地方使用绑定类型(硬编码)
将公共方法添加到控制器工厂
GetBinding
...?
什么是正确的方法?
更新
我的控制器工厂:
public class NinjectControllerFactory : DefaultControllerFactory
{
private IKernel ninject_kernel;
public NinjectControllerFactory()
{
ninject_kernel = new StandardKernel();
AddBindings();
}
private void AddBindings()
{
ninject_kernel.Bind<IBookRepository>().To<DataManagement.Concrete.EFBookRepository>();
// ninject_kernel.Bind<IBookRepository>().ToConstant(DataManagement.Mocks.Mocks.BookRepository);
}
public T GetBinding<T>()
{
return ninject_kernel.Get<T>();
}
protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
return null;
else
return (IController)ninject_kernel.Get(controllerType);
}
}