使用统一.一个类中的累积会中断另一个类中的注入

本文关键字:中断 另一个 注入 一个 | 更新日期: 2023-09-27 18:03:39

我有一个会员提供程序,它创建了依赖注入的问题。我想知道为什么会发生

这是基本控制器的一些部件。(正常工作)

namespace Our.Web.Controllers
{
    public abstract partial class OurBaseController : VABController
    {
        //--------------------------------------
        //  EVENT DECLARATIONS
        //--------------------------------------
        //--------------------------------------
        //  CLASS CONSTANTS
        //--------------------------------------
        //--------------------------------------
        //  PRIVATE VARIABLES
        //--------------------------------------
        private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
        private UserInfo m_info;
        //--------------------------------------
        //  PROTECTED VARIABLES
        //--------------------------------------
        //--------------------------------------
        //  CONSTRUCTOR & INITIALIZATION
        //--------------------------------------
        protected override void Initialize(System.Web.Routing.RequestContext requestContext)
        {
            base.Initialize(requestContext);
            logger.Debug("Initializing OurBaseController.");
            m_info = UserInfoAccessor.GetCurrent();
        }
        //--------------------------------------
        //  GETTER/SETTERS
        //--------------------------------------
        [Dependency]
        public UserInfoAccessor UserInfoAccessor { get; set; }
        <snip>
    }
}

这是来自Global.asax.cs的unity注册的相关部分:

namespace OurWeb
{
    public class MvcApplication : System.Web.HttpApplication, IContainerAccessor
    {
        <snip>
        //--------------------------------------
        //  GETTER/SETTERS
        //--------------------------------------
        IUnityContainer IContainerAccessor.Container
        {
            get { return MvcUnityContainer.Container ; }
        }
        //--------------------------------------
        //  EVENT HANDLERS
        //--------------------------------------
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RegisterRoutes(RouteTable.Routes);
            ConfigureUnity();
            <snip>
        }
        <snip>
        //--------------------------------------
        //  STATIC METHODS
        //--------------------------------------
        <snip>
        //--------------------------------------
        //  PRIVATE & PROTECTED INSTANCE METHODS
        //--------------------------------------
        private void ConfigureUnity()
        {
            //Create UnityContainer          
            IUnityContainer container = new UnityContainer()
                <snip>
                .RegisterType<UserInfoAccessor>()
                <snip>
            //Set container for Controller Factory
            MvcUnityContainer.Container = container;
            <snip>
            //Set Controller Factory as UnityControllerFactory
            ControllerBuilder.Current.SetControllerFactory(
                                typeof(UnityControllerFactory));
        }
        <snip>
    }
}

现在,当我添加一个自定义成员资格提供程序时,我不能向它注入,所以我在构造函数中使用了集结。

namespace System.Web.Security
{
    public class OurMembershipProvider : SqlMembershipProvider
    {
        //--------------------------------------
        //  EVENT DECLARATIONS
        //--------------------------------------
        //--------------------------------------
        //  CLASS CONSTANTS
        //--------------------------------------
        //--------------------------------------
        //  PRIVATE VARIABLES
        //--------------------------------------
        private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
        //--------------------------------------
        //  PROTECTED VARIABLES
        //--------------------------------------
        //--------------------------------------
        //  CONSTRUCTOR & INITIALIZATION
        //--------------------------------------
        public OurMembershipProvider()
            : base()
        {
            // Can't inject so we'll ask the container to build the instance.
            IUnityContainer container = GetUnityContainer();
            container.BuildUp(this);
        }
        //--------------------------------------
        //  GETTER/SETTERS
        //--------------------------------------
        [Dependency]
        public UserInfoAccessor UserInfoAccessor { get; set; }
        //--------------------------------------
        //  PUBLIC METHODS
        //--------------------------------------
        public override bool ValidateUser(string username, string password)
        {
            //Sufficient for the question. In reality it contains account mapping validation logic.
            return base.ValidateUser(username, password);
        }
        //--------------------------------------
        //  EVENT HANDLERS
        //--------------------------------------
        //--------------------------------------
        //  STATIC METHODS
        //--------------------------------------
        //--------------------------------------
        //  PRIVATE & PROTECTED INSTANCE METHODS
        //--------------------------------------
        private IUnityContainer GetUnityContainer()
        {
            var context = HttpContext.Current;
            if (context == null)
                throw new Exception("No HttpContext");
            var accessor = context.ApplicationInstance as IContainerAccessor;
            if (accessor == null)
                throw new Exception("The global HttpApplication instance needs to implement " + typeof(IContainerAccessor).FullName);
            if (accessor.Container == null)
                throw new Exception("HttpApplication has no container initialized");
            return accessor.Container;
        }
    }
}

类驻留在MVC web项目,所以我刚刚改变了web。像这样配置:

<!--<add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" applicationName="/"/>-->
<add name="AspNetSqlMembershipProvider" type="System.Web.Security.OurMembershipProvider" connectionStringName="ApplicationServices" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" applicationName="/"/>  

现在,当我这样做的时候,我在OurBaseController的构造函数中得到一个空引用异常:m_info = UserInfoAccessor.GetCurrent();

为什么当我注册这个自定义成员提供者时,Unity不注入UserInfoAccessor,但当我回到标准提供者时,它工作得很好?
积液会影响注射吗?

我在调试器或elmah中没有得到任何其他异常。

分辨率

20110726

自定义成员对象是在UnityContainer被设置时创建的。这使得容器不可用,在初始化期间的异常使UnityContainer保持未初始化,这就是为什么容器不可用。

我从中学到了什么?
使用unity容器作为资源定位器是一个充满蠕虫的罐子。

为什么我在配置时错过了错误?
当我打开这个网站时,我的浏览器打开了一个新标签。我放弃了它,刷新了之前的一个窗口。因此,我正在查看第二个请求的结果,其中站点已经启动。

使用统一.一个类中的累积会中断另一个类中的注入

自定义成员对象在UnityContainer被设置时被创建。这使得容器不可用,在初始化期间的异常使UnityContainer保持未初始化,这就是为什么容器不可用。

我从中学到了什么?
使用unity容器作为资源定位器是一个充满蠕虫的罐子。

为什么我在配置时错过了错误?
当我打开这个网站时,我的浏览器打开了一个新标签。我放弃了它,刷新了之前的一个窗口。因此,我正在查看第二个请求的结果,其中站点已经启动。