MVC4 プロジェクトのフィルターからコマンド プロセッサにコマンドを送信しようとしています。
問題:
フィルターに入力する NServiceBus インスタンスを取得できません。
コンポーネント:
- ASP.NET MVC 4
- NServiceBus バージョン 3
- ストラクチャーマップ
属性/フィルター:
namespace AMS.WebApp.Filters
{
public class AMSAuthorizeAttribute : AuthorizeAttribute
{
public IBus Bus { get; set; }
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
bool accessGranted = false;
accessGranted = base.AuthorizeCore(httpContext);
// arbitrary command, don't worry about it
// Why is Bus still null?
var requestAccess = new RequestingAccess();
Bus.Send("AMS.AccessControl.CommandProcessor", requestAccess);
//if(isAdmin)
// accessGranted = true;
#if DEBUG
accessGranted = true;
#endif
return accessGranted;
}
}
}
IOC コード:
using AMS.WebApp.Filters;
using NServiceBus;
using StructureMap;
namespace AMS.WebApp.DependencyResolution {
public static class IoC {
public static IContainer Initialize() {
ObjectFactory.Initialize(x =>
{
x.Scan(scan =>
{
scan.AssembliesFromApplicationBaseDirectory();
scan.WithDefaultConventions();
});
//This doesn't work
//x.SetAllProperties(y => y.OfType<IBus>());
//Neither does this
//x.ForConcreteType<AMSAuthorizeAttribute>()
// .Configure
// .Setter<IBus>(a => a.Bus)
// .IsTheDefault();
});
return ObjectFactory.Container;
}
}
}
また、コントローラーからバス インスタンスを渡すことで構造マップを完全にバイパスしようとした結果、次の結果が得られました。
An object reference is required for the non-static field, method, or property
この時点で、アトリビュート/フィルターとストラクチャー マップに問題があることは確かですが、それが何であるかはよくわかりません。
警告: 受け入れられた回答は、アクション フィルターで nservicebus を取得する実際の問題を解決しませんが、アクション フィルターで DI を取得する方法に対処します。Nservicebus 固有の質問については、ASP.NET MVC4 NServiceBus Attribute/Filter StructureMapを参照してください。