私はいくつかの DI コンテナーをいじっており、TinyIoC が気に入っています。Nancy/fx を通じて初めて紹介されました。
現在の MVC プロジェクトで使用しようとしていますが、コンストラクターにインターフェイス パラメーターを含むコントローラーをインスタンス化できないようです。
私が理解していることから、それは簡単なはずです。基本的な登録を処理する AutoRegister メソッドも付属しています。MVC の DefaultControllerFactory をオーバーライドできるようにする IControllerFactory を実装しました。これは単にコントローラーをインスタンス化するもので、BTW は実行されず、DI を実行しません。
また、TinyIoC を活用するために IDependancyResolver を実装しました。ただし、コントローラーのインスタンス化は機能しません。TinyIoC を使用してコントローラーをインスタンス化するために使用する方法を示すサンプル コードはありますか?
これが私がこれまでに持っているものです。
ControllerFactory コード
public class TinyIoCControllerFactory : IControllerFactory
{
private readonly TinyIoCContainer _container;
public TinyIoCControllerFactory(TinyIoCContainer container)
{
_container = container;
}
public IController CreateController(RequestContext requestContext, string controllerName)
{
return (_container.CanResolve<IController>(controllerName))
? _container.Resolve<IController>(controllerName)
: null;
}
public SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName)
{
return SessionStateBehavior.Default;
}
public void ReleaseController(IController controller)
{
var disposeable = (IDisposable) controller;
if (disposeable == null) return;
disposeable.Dispose();
}
}
DependencyResolver コード
public class TinyIoCResolver : IDependencyResolver
{
private readonly TinyIoCContainer _container;
public TinyIoCResolver(TinyIoCContainer container)
{
_container = container;
}
public object GetService(Type serviceType)
{
return _container.Resolve(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return _container.ResolveAll(serviceType, true);
}
}
登録コード
public static void RegisterContainer(TinyIoCContainer container)
{
ControllerInstaller.Install(container);
RepositoryInstaller.Install(container);
container.Register<IControllerFactory>(new TinyIoCControllerFactory(container));
DependencyResolver.SetResolver(new TinyIoCResolver(container));
}
public static void Install(TinyIoCContainer container)
{
container.Register<ISomeDBContext, SomeDbContext>();
container.Register<ISomeRepository, SomeRepository>();
}
public static void Install(TinyIoCContainer container)
{
container.Register<IController, HomeController>();
container.Register<IController, TestController>();
}
インスタンス化を強制するには、UsingConstructor() メソッドを使用する必要がありますか? もしそうなら、どうやってそれを使うのですか?
これは、コンストラクター パラメーターを持たない Home コントローラーのみのエラーのスナップショットです。
エラーメッセージは、引数を持つコントローラーでも同じです。最終結果は、コントローラがインスタンス化されていないということです。
ありがとうティム