0

私はいくつかの 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 コントローラーのみのエラーのスナップショットです。

ここにエラーがあります

エラーメッセージは、引数を持つコントローラーでも同じです。最終結果は、コントローラがインスタンス化されていないということです。

ありがとうティム

4

1 に答える 1

1

適切な依存性注入コンテナーを使用すると、独自の IControllerBuilder を作成する必要はありません。TinyIoCResolver (IDependencyResolver) を登録するだけで、後は ASP.NET MVC が行います。

于 2014-08-10T16:12:38.490 に答える