1

我最近关于 SimpleInjector 和混合 Web 请求/线程生活方式的问题之后,我似乎没有完全理解技术要求,并且一直在做一些我实际上不需要做的事情。

使用此代码

interface IUnitOfWork { }
interface IWebUnitOfWork : IUnitOfWork { }
interface IThreadUnitOfWork : IUnitOfWork { }
class UnitOfWork : IWebUnitOfWork, IThreadUnitOfWork { }

container.RegisterPerWebRequest<IWebUnitOfWork, UnitOfWork>();
container.RegisterLifetimeScope<IThreadUnitOfWork, UnitOfWork>();
container.Register<IUnitOfWork>(() => container.GetInstance<UnitOfWork>());

// Register as hybrid PerWebRequest / PerLifetimeScope.
container.Register<UnitOfWork>(() =>
{
    if (HttpContext.Current != null)
        return container.GetInstance<IWebUnitOfWork>() as UnitOfWork;
    else
        return container.GetInstance<IThreadUnitOfWork>() as UnitOfWork;
});

我的理解是,对于在 IIS 中运行的 AppDomain,IWebUnitOfWork将返回,否则会出现错误,除非我明确声明 LifetimeScope 的实例来包装对容器的调用(它将返回IThreadUnitOfWork)。

以下陈述让我意识到我并不完全理解我一直在做什么!

但是,您似乎不需要混合生活方式。混合生活方式是一种可以动态切换的生活方式(在每次调用 GetInstance 和每次注入时),而您似乎只需要在启动期间进行切换。

我的问题是:在什么情况下可以在不存在 HttpContext 的情况下调用在 IIS 中运行的 AppDomain 中加载的容器(或任何其他类),无论是静态的还是实例的?

4

1 回答 1

1

正如 Steven 在评论中概述的那样,当 Web 请求可以在另一个线程上启动进程时,通常需要混合注册。在这种情况下,可以要求容器为 Web 请求和线程请求提供服务。

于 2013-02-05T09:04:43.010 回答