我正在尝试创建完全单例应用程序(Web 和控制台)。但是实体 DbContext 应该在 web 上使用 PerWebRequest。
我应该如何在容器上注册它以支持这一点?我知道一旦类被初始化为单例,我将在内存上的单个实例上运行,所有注入的类也作为单例。
以下代码是我对所有 Web 应用程序和控制台应用程序的容器初始化。- 在控制台中运行时我应该如何注册?- 当在 Web 上运行并且 Owin 调用启动事物时,有时我需要解析要在身份验证中使用的对象,但 Owin 在“无上下文”环境中运行。如何检测和使用它?
private static IContainer Initialize(IContainer container)
{
if (container == null)
container = new Container(
rules => rules
.WithDefaultReuseInsteadOfTransient(Reuse.InWebRequest)
.WithFactorySelector(Rules.SelectLastRegisteredFactory())
.With(FactoryMethod.ConstructorWithResolvableArguments)
.WithoutThrowOnRegisteringDisposableTransient(),
scopeContext: new AsyncExecutionFlowScopeContext()
);
string prefix = GetPrefix();
var implementingClasses =
AppDomain.CurrentDomain.GetAssemblies().ToList()
.Where(x => x.FullName.StartsWith(prefix))
.SelectMany(x => x.GetTypes())
.Where(type =>
(type.Namespace != null && type.Namespace.StartsWith(prefix)) &&
type.IsPublic && // get public types
!type.IsAbstract && // which are not interfaces nor abstract
type.GetInterfaces().Length != 0); // which implementing some interface(s)
Parallel.ForEach(implementingClasses, implementingClass =>
{
container.RegisterMany(new[] { implementingClass }, Reuse.Singleton, serviceTypeCondition: type => type.IsInterface);
});
return container;
}