3

Unity で依存性注入を実装するためにこのブログをフォローしようとしていますが、boostrapper.cs でエラーが発生しています (Unity.MVC4 ライブラリを使用しています)。誰かが私がここに欠けているものを教えてもらえますか?

エラー: IoCContainer は Microsoft.Practices.ServiceLocation.IServiceLocator を実装していないようです。パラメータ名: commonServiceLocator

 public static class Bootstrapper
    {
    public static IUnityContainer Initialise()
    {
      var container = BuildUnityContainer();

      DependencyResolver.SetResolver(new UnityDependencyResolver(container));

      // this throws "does not appear to implement Microsoft.Practices.ServiceLocation.IServiceLocator.... error"
      DependencyResolver.SetResolver(new IoCContainer(container)); 

      return container;
    }

    ....
  }

これは IoCContainer クラスです

public class ScopeContainer : IDependencyScope
    {
        protected IUnityContainer container;

        public ScopeContainer(IUnityContainer container)
        {
            if (container == null)
            {
                throw new ArgumentNullException("container");
            }
            this.container = container;
        }

        public object GetService(Type serviceType)
        {
            if (container.IsRegistered(serviceType))
            {
                return container.Resolve(serviceType);
            }
            else
            {
                return null;
            }
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            if (container.IsRegistered(serviceType))
            {
                return container.ResolveAll(serviceType);
            }
            else
            {
                return new List<object>();
            }
        }

        public void Dispose()
        {
            container.Dispose();
        }
    }

    class IoCContainer : ScopeContainer, IDependencyResolver
    {
        public IoCContainer(IUnityContainer container)
            : base(container)
        {
        }

        public IDependencyScope BeginScope()
        {
            var child = container.CreateChildContainer();
            return new ScopeContainer(child);
        }
    }

追加!app_start でブートラッパーを呼び出していますが、それが正しいかどうかはわかりません

protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            Bootstrapper.Initialise();
        }

また、ルーティングに関連している可能性があると感じています.webapiとmvcが異なる「アクティベーター」などを使用していることを読んで、実際に構成に従来のMVCルーティングを追加しました

 public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

            config.Routes.MapHttpRoute(
              name: "RestApi",
              routeTemplate: "api/{controller}/{action}/{id}",
              defaults: new { id = RouteParameter.Optional }
            );
4

1 に答える 1

5

Unity.WebAPI答えが見つかりました.IoCContainerをインストールして設定DependencyResolverするだけでいいので、IoCContainerを作成する必要さえないので、ブログは時代遅れのようですnew Unity.WebApi.UnityDependencyResolver(container);

public static class Bootstrapper
  {
    public static IUnityContainer Initialise()
    {
      var container = BuildUnityContainer();

      DependencyResolver.SetResolver(new UnityDependencyResolver(container));

      GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);

      return container;
    }

クレジット: http://netmvc.blogspot.com/2012/04/dependency-injection-in-aspnet-mvc-4.html

于 2013-07-04T01:41:28.527 に答える