私はStevenSandersonとAdamFreemanによる「ASP.NetMVC3」をフォローしていますが、ある時点で彼らはを定義していますControllerFactory
。公開されたインターフェースはコントローラーを作成するためのものであり、コントローラーに注入されるもの(データを提供するクラスなど)はブラックボックス(外界用)です。
私は、実際にはコントローラーを取得したくないのですが、コントローラーのバインディングセット、つまりデータを提供するクラスを取得したいと思っています。
コントローラファクトリに別のメソッドを追加することもできますが(のようにGetBinding
)、それは機能しますが、それは正しい方法でしょうか?
何かに集中するためだけに。私にはIDataProvider
2つのクラスがあります-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);
}
}