非同期ではない httprequest を使用して AutoFac をセットアップするのに苦労しています。
私は App_Start に次のものを持っています
var builder = new ContainerBuilder();
builder.RegisterControllers(typeof(MvcApplication).Assembly);
builder.RegisterType<sfEntities>().As<IUnitOfWork>().InstancePerHttpRequest();
builder.RegisterGeneric(typeof(sfRepository<>)).As(typeof(IRepository<>)).InstancePerHttpRequest();
builder.RegisterGeneric(typeof(BaseServices<>)).As(typeof(IBaseServices<>)).InstancePerHttpRequest();
builder.RegisterType<EmailServices>().As<IEmailServices>().InstancePerHttpRequest();
builder.RegisterType<UserServices>().As<IUserServices>().InstancePerHttpRequest();
builder.RegisterType<ChatServices>().As<IChatServices>().InstancePerHttpRequest();
builder.RegisterType<DefaultFormsAuthentication>();
builder.RegisterType<WebSecurity>();
builder.RegisterType<Chat>();
IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
InstancePerLifetimeScope() に変更すると、UnitofWork.SaveChanges() で問題が発生します。この方法のセットアップは、非同期呼び出しを除いて正常に機能します。
ps: UnitOfWork はサービス間で EF DbContext を渡し、同じインスタンスが使用され、適切に破棄されるようにします。InstancePerLifetimeScope に変更すると、.SaveChanges() を呼び出すときに ID の競合が発生しました。これは、おそらく UnitOfWork のインスタンスが複数存在する必要があるためです。
次のコードは、次の例外をスローします。
Timer timer = new Timer(new TimerCallback(OnTimer), null, TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(1));
private static void OnTimer(object o)
{
using (var timerScope = AutofacDependencyResolver.Current.ApplicationContainer.BeginLifetimeScope())
{
var chatServices = timerScope.Resolve<IChatServices>();
chatServices.MarkInactiveUsers();
}
}
「httpRequest」に一致するタグを持つスコープは、インスタンスが要求されたスコープから見えません。これは通常、HTTP ごとのリクエストとして登録されたコンポーネントが、SingleInstance() コンポーネント (または同様のシナリオ) によって要求されていることを示します。Web 統合の下では、コンテナー自体からではなく、常に DependencyResolver.Current または ILifetimeScopeProvider.RequestLifetime から依存関係を要求します。 .
SignalR では、次のコードは次の例外をスローします。
SignalR.GlobalHost.DependencyResolver.Register(typeof(Chat), () => new Chat(DependencyResolver.Current.GetService<IUnitOfWork>(), DependencyResolver.Current.GetService<IChatServices>(), DependencyResolver.Current.GetService<IUserServices>()));
HttpContext が使用できないため、要求の有効期間スコープを作成できません
前もって感謝します!