我有一個會員提供程序,它會產生依賴注入的問題。 我想了解它爲什麼會發生。在一個類中使用Unity.BuildUp在其他類中破壞注入
這是基本控制器的一些部分。 (它的工作原理像它應該。)
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中的相關部分:
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>
}
}
現在,當我添加自定義成員資格提供,我不能注入它,所以我在構造函數中使用了BuildUp。
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.config中:
<!--<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,但是當我回到標準模塊時它工作正常嗎?
BuildUp是否打擾注射?
我沒有在調試器或elmah中得到任何其他例外。
解決方案20110726
時正在建立UnityContainer的自定義成員對象得到了創建。這使得容器不可用,並且初始化期間的異常使得UnityContainer保持不初始化,這是容器不可用的原因。
我從中學到了什麼?
使用統一容器作爲資源定位器是一個充滿蠕蟲的罐頭。
爲什麼我在配置期間錯過了錯誤?
當我啓動該網站時,我的網絡瀏覽器打開了一個新選項卡。我放棄了這一點,並刷新了一個較早的窗口。所以我正在查看網站已經啓動的第二個請求的結果。
在類型聲明中缺少程序集是否正確?!? – PVitt
這是正確的。 –
調用堆棧看起來像什麼? –