使用统一.一个类中的累积会中断另一个类中的注入
本文关键字:中断 另一个 注入 一个 | 更新日期: 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容器作为资源定位器是一个充满蠕虫的罐子。
为什么我在配置时错过了错误?
当我打开这个网站时,我的浏览器打开了一个新标签。我放弃了它,刷新了之前的一个窗口。因此,我正在查看第二个请求的结果,其中站点已经启动。