Unity.MVC ASP.Net控制器构造函数未调用

时间:2017-07-27 09:16:43

标签: asp.net-mvc unity-container

我试图在Unity.Mvc上使用最新版本但由于某种原因我的控制器永远不会被调用。我有以下控制器

public class AdminApiController : ApiController
    {
        private IUserRepository userRepository;

        public AdminApiController(IUserRepository userRepository)
        {
            this.userRepository = userRepository;
        }

        [Route("api/AdminApi/{lastName}/{currentUserId}")]
        public IEnumerable<UserDetail> GetUsers(string lastName, string currentUserId)
        {
            return userRepository.Search(lastName, currentUserId)
                .Select(u => new UserDetail { Id = u.Id, Name = u.FirstName + " " + u.LastName });
        }

    }

并且最新版本的Unity.Mvc似乎使用UnityWebActivator类来设置容器,即

public static class UnityWebActivator
    {
        /// <summary>Integrates Unity when the application starts.</summary>
        public static void Start() 
        {
            var container = UnityConfig.GetConfiguredContainer();

            FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());
            FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));

            DependencyResolver.SetResolver(new UnityDependencyResolver(container));

            // TODO: Uncomment if you want to use PerRequestLifetimeManager
            // Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));
        }

        /// <summary>Disposes the Unity container when the application is shut down.</summary>
        public static void Shutdown()
        {
            var container = UnityConfig.GetConfiguredContainer();
            container.Dispose();
        }
    }

在我的Unity配置中我有以下

public class UnityConfig
    {
        #region Unity Container
        private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() =>
        {
            var container = new UnityContainer();
            RegisterTypes(container);
            return container;
        });

        /// <summary>
        /// Gets the configured Unity container.
        /// </summary>
        public static IUnityContainer GetConfiguredContainer()
        {
            return container.Value;
        }
        #endregion

        /// <summary>Registers the type mappings with the Unity container.</summary>
        /// <param name="container">The unity container to configure.</param>
        /// <remarks>There is no need to register concrete types such as controllers or API controllers (unless you want to 
        /// change the defaults), as Unity allows resolving a concrete type even if it was not previously registered.</remarks>
        public static void RegisterTypes(IUnityContainer container)
        {
            // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements.
            // container.LoadConfiguration();

            // TODO: Register your types here
            // container.RegisterType<IProductRepository, ProductRepository>();

            container.RegisterType<IUserDatabase, UserDatabase>();
            container.RegisterType<IUserRepository, UserRepository>();
        }
    }

注册我的内存仓库,即

public class UserRepository : IUserRepository
    {
        IUserDatabase db;

        public UserRepository(IUserDatabase db)
        {
            this.db = db;
        }

        public IEnumerable<User> Search(string lastName, string currentUserId)
        {
            if (Exists(currentUserId))
            {
                return GetByLastName(lastName);
            }

            return new List<User>();
        }

        private IEnumerable<User> GetByLastName(string lastName)
        {
            return db.Users.Where(u => u.LastName == lastName);
        }

        private bool Exists(string id)
        {
            return db.Users.Any(u => u.Id == id);
        }
    }

其中

public class UserDatabase : IUserDatabase
    {
        private User[] users = new User[]
                       {
                        new User("1", "John", "Smith"),
                        new User("2", "Fred", "Smith"),
                        new User("3", "John", "Doe")
                       };

        public IEnumerable<User> Users
        {
            get
            {
                return users;
            }
        }
    }

当我启动应用程序时,我可以看到我的类型是使用断点注册的,但是当我在AdminApiController的构造函数中放置断点时,它永远不会被调用。随后从未创建控制器,当我尝试使用控制器时出现内部服务器错误。

我在设置中缺少什么来确保实例化AdminApiController并从容器中注入对象?

0 个答案:

没有答案