私は依存性注入に問題を引き起こすメンバーシッププロバイダがあります。 私はなぜそれが起こるのか理解したいと思います。Unity.BuildUpを1つのクラスで使用すると、他のクラスのインジェクションが中断されます
これは、ベースコントローラの一部です。 (それが必要のように動作します。)
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を使用しました。私はこれを行っているとき
<!--<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="/"/>
は今、私は中にnull参照の例外を取得:
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;
}
}
}
クラスは、私はちょうどこのようにweb.configファイルを変更したMVC Webプロジェクトに存在しますこの行のOurBaseController
のコンストラクタ:m_info = UserInfoAccessor.GetCurrent();
どのように私はこのカスタムメンバシッププロバイダを登録し、私は標準のものに戻ったときに、それが正常に動作したときにUnityがUserInfoAccessorを注入しない来ますか?
BuildUpは注射を妨害しますか?
私はデバッガまたはelmahに他の例外はありません。
解決20110726
UnityContainerが設定されていたときにカスタムメンバシップのオブジェクトが作成されました。コンテナが利用できなくなり、初期化中に例外が発生した場合、UnityContainerはuninitializad状態になり、そのコンテナは使用できませんでした。
私はこれで何を学んだのですか?
ユニティコンテナをリソースロケータとして使用すると、ワームがいっぱいです。
なぜ構成中にエラーが発生しましたか?
サイトを開始したときに、Webブラウザで新しいタブが開きました。私はそれを破棄し、以前のウィンドウをリフレッシュしました。だから私はサイトが既に開始されていた2番目のリクエストの結果を見ていました。
型宣言でアセンブリが見つからないのは正しいですか? – PVitt
それは正しいです。 –
コールスタックはどのように見えますか? –