新しい ASP MVC5MembershipReboot
テンプレートとAutofac
. デフォルトの MVC5 テンプレートを使用してサイトをセットアップし、テンプレートに同梱されてMembershipReboot
いる ASP Identity フレームワークの代わりとしてフレームワークを接続しようとしました。
IOwinContext
私が抱えているこの問題は、Autofac
コンテナから解決しようとしています。これが Startup クラスでの私の配線です (基本に切り詰めます)。これは、アプリケーションのサンプルで使用されている配線MembershipReboot Owin
です (ただし、彼は Nancy を使用しています)。
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.Register(c => new DefaultUserAccountRepository())
.As<IUserAccountRepository>()
.As<IUserAccountQuery>()
.InstancePerLifetimeScope();
builder.RegisterType<UserAccountService>()
.AsSelf()
.InstancePerLifetimeScope();
builder.Register(ctx =>
{
**var owin = ctx.Resolve<IOwinContext>();** //fails here
return new OwinAuthenticationService(
MembershipRebootOwinConstants.AuthenticationType,
ctx.Resolve<UserAccountService>(),
owin.Environment);
})
.As<AuthenticationService>()
.InstancePerLifetimeScope();
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
ConfigureAuth(app);
app.Use(async (ctx, next) =>
{
using (var scope = container.BeginLifetimeScope(b =>
{
b.RegisterInstance(ctx).As<IOwinContext>();
}))
{
ctx.Environment.SetUserAccountService(() => scope.Resolve<UserAccountService>());
ctx.Environment.SetAuthenticationService(() => scope.Resolve<AuthenticationService>());
await next();
}
});
}
そして、これがコントローラーコンストラクターで指定された依存関係を持つ私のコントローラーです。
public class HomeController : Controller
{
private readonly AuthenticationService service;
public HomeController(AuthenticationService service)
{
this.service = service;
}
public ActionResult Index()
{
return View();
}
public ActionResult About()
{
ViewBag.Message = "Your application description page.";
return View();
}
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
return View();
}
}
MVC フレームワークがコンテナーを使用してコンポーネントを解決するには、Autofac
コンテナーをラップする必要があるようです。これが、サンプルと私の MVC5 での使用とAutofacDependencyResolver
の唯一の大きな違いです。Nancy Owin
これを行うと、(私のトレースから)最初にOWIN middleware
スタックを通過せずに依存関係が解決されているように見えるため、IOwinContext
登録されません。
ここで何が間違っていますか?
アップデート:
ブロックさん、私のプロジェクトに設定を移行すると、あなたの新しいサンプルは完璧に動作します。私の理解では、新しいサンプルのこの行は、現在の OwinContext をコンテナーに登録しているように見えますが、それは以前に欠けていたものです。
builder.Register(ctx=>HttpContext.Current.GetOwinContext()).As<IOwinContext>();
あれですか