- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我让 AutoFac 与 MVC4 一起正常工作。我正在尝试过渡到 Web API 2。这是我设置 AutoFac 的内容:
public class AutofacRegistrations
{
public static void RegisterAndSetResolver()
{
// Create the container builder.
var containerBuilder = new ContainerBuilder();
// Register the Web API controllers.
containerBuilder.RegisterApiControllers(Assembly.GetExecutingAssembly());
// Only generate one SessionFactory ever because it is expensive.
containerBuilder.Register(x => new NHibernateConfiguration().Configure().BuildSessionFactory()).SingleInstance();
// Everything else wants an instance of Session per HTTP request, so indicate that:
containerBuilder.Register(x => x.Resolve<ISessionFactory>().OpenSession()).InstancePerApiRequest();
containerBuilder.Register(x => LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType)).InstancePerApiRequest();
containerBuilder.RegisterType<NHibernateDaoFactory>().As<IDaoFactory>().InstancePerApiRequest();
containerBuilder.RegisterType<StreamusManagerFactory>().As<IManagerFactory>().InstancePerApiRequest();
// Build the container.
ILifetimeScope container = containerBuilder.Build();
// Create the depenedency resolver.
var dependencyResolver = new AutofacWebApiDependencyResolver(container);
// Configure Web API with the dependency resolver.
GlobalConfiguration.Configuration.DependencyResolver = dependencyResolver;
}
}
我非常确信所有这些都是正确的。当我尝试设置一些测试用例时,我的问题就出现了。我的测试用例的基类不是 Controller ,所以它不会自动传递任何东西。在 MVC4 中我做了以下事情:
[SetUp]
public void SetUp()
{
HttpSimulator = new HttpSimulator().SimulateRequest();
Logger = DependencyResolver.Current.GetService<ILog>();
DaoFactory = DependencyResolver.Current.GetService<IDaoFactory>();
Session = DependencyResolver.Current.GetService<ISession>();
ManagerFactory = DependencyResolver.Current.GetService<IManagerFactory>();
}
[TearDown]
public void TearDown()
{
HttpSimulator.Dispose();
}
不幸的是,没有 DependencyResolver.Current在 WebAPI 中。所以我想知道如何正确地做到这一点?
这可以构建,但不正确。我收到消息“ session 已关闭!”当我尝试执行测试用例时:
[SetUp]
public void SetUp()
{
using (var scope = GlobalConfiguration.Configuration.DependencyResolver.BeginScope())
{
// TODO: Consider initializing Helpers during setup to keep this DRY.
Logger = (ILog)scope.GetService(typeof(ILog));
DaoFactory = (IDaoFactory)scope.GetService(typeof(IDaoFactory));
Session = (ISession)scope.GetService(typeof(ISession));
ManagerFactory = (IManagerFactory)scope.GetService(typeof(IManagerFactory));
}
}
最佳答案
使用 WebAPI,您不需要访问当前解析器,因为当前依赖范围通常与入站 HttpRequestMessage
一起出现。该消息还负责生成新的请求范围。
您可以在 System.Net.Http.HttpRequestMessageExtensions.GetDependencyScope
方法中查看相关代码。
在 WebAPI 中您会注意到的一件大事是您实际上不需要在全局静态值中设置任何内容 - 也就是说,您不需要设置全局配置/解析器因为现在一切都是基于实例的。
对于测试,这意味着:
HttpRequestMessage
。HttpRequestMessage
,这将依次处理依赖范围等。HttpRequestMessage.GetDependencyScope()
如果他们需要手动解决某些问题并且请求消息将用于协调/传递范围。以更具体的方式,它可能看起来像:
private HttpRequestMessage _request;
[SetUp]
public void SetUp()
{
var builder = new ContainerBuilder();
// Register stuff.
var container = builder.Build();
var resolver = new AutofacWebApiDependencyResolver(container);
var config = new HttpConfiguration();
config.DependencyResolver = resolver;
config.EnsureInitialized();
this._request = new HttpRequestMessage();
this._request.SetConfiguration(config);
}
[TearDown]
public void TearDown()
{
this._request.Dispose();
}
[Test]
public void Test()
{
// When you need to resolve something, use the request message
this._request.GetDependencyScope().GetService(typeof(TheThing));
}
这样做的好处是您不必在每次测试后都与全局配置设置作斗争或重置静态值。
您可能想知道为什么要传递整个请求消息而不仅仅是依赖项解析器 - 原因是请求消息协调和控制依赖项范围的生命周期。否则,当您多次调用 GetDependencyScope
时,您将获得多个不同的范围,而不是您期望的相同范围。
从设计角度考虑的一些事情:
RegisterAndSetResolver
方法中重复使用,而不必担心全局静力学被篡改。RegisterAndSetResolver
修改全局静态配置,您可以考虑只在 HttpConfiguration
对象上设置解析器,该对象连接在 WebAPI 为您提供的 WebApiConfig.Register
方法。将 HttpConfiguration
对象作为参数,并将解析器设置在该对象上而不是全局对象上。无论如何,HttpRequestMessage
是用于 WebAPI 的方法。
关于c# - 从 MVC 的 DependencyResolver 过渡到 AutofacWebApiDependencyResolver - .Current 在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22331095/
我有现有的项目,它使用 AutoFac 作为 IoC。 在注册码中我有这些行: var resolver = builder.Build(); DependencyResolver.SetResolv
我正在使用 Microsoft Unity 作为 IoC 容器开发新的 ASP.Net Web API 项目。我有点困惑哪个是正确的。 如果我设置 System.Web.Http.HttpConfig
ASP.NET MVC 3 引入了 DependencyResolver,我看到很多文章说它有多酷。但是等等...与 ControllerFactory 方法相比有什么区别?对我来说看起来很相似。 最
Owin 的一大优点是它不依赖于 System.Web。如果 WebApi 明确需要这些方面的内容,我到底该如何设置 DI: var config = new HttpConfiguration();
我正在尝试使用 Dependency.SetResolver 方法在新应用程序上设置容器,并将 autofac 与 autofac mvc 5 集成结合使用。 问题是设置解析器似乎没有做任何事情。将始
我正在编写的应用程序中使用 SignalR,但我对 https://github.com/SignalR/SignalR/wiki/Hubs 中的最后一个示例等示例感到困惑。特别是 AspNetHos
按照我在这个帖子中得到的建议 [ Ninject UOW pattern, new ConnectionString after user is authenticated我现在明白我不应该使用以下行
我们有一个复杂的应用程序,其集线器分布在多个 dll 中。完整的应用程序使用 DI 和 LightCore。现在我们面临的问题是 SignalR 似乎没有使用我们编写的 DependencyResol
我正在尝试在 Controller 中使用 dependencyinjection 并使用System.Web.MvcDependencyResolver.Current.GetService() 用
根据 this tutorial ,要在我的 Asp.net MVC 3 应用程序中使用 Ninject,我所要做的就是通过 Nuget 安装包并配置依赖项。 按照这些步骤操作 Install Pac
我正在使用 OWIN 在使用 galasoft mvvmlight 框架的 wpf 桌面应用程序中自行托管 Web api Web 服务。当我尝试将我的模型数据服务之一依赖注入(inject)到 we
我有一个 MVC 4 应用程序,其中使用 SignalR 和依赖项注入(inject)框架。因此,我需要实现一个自定义的 DependencyResolver。为了连接它,我正在使用
我使用的是 SignalR 0.5.2,我正在尝试使用 Unity 设置 DependencyResolver。我已经写了我能写的最简单的代码。我有一个集线器,我正尝试将其注入(inject)其中,如
我整个上午都在努力解决这个问题,但似乎是时候征求意见了。 我有一个 MVC/WebApi/SignalR 应用程序。我有一项服务,我想与 Web 应用程序一起启动。我希望注入(inject)此服务。所
我的小型 Web API 项目(通过 SelfHostHttpServer 托管)有一些我想注入(inject) Controller 的依赖项。为了做到这一点,我实现了 IDependencyRes
在具有 Ninject.MVC 2.2.0.3 ( after merge ) 的 MVC3 应用程序中,我没有将存储库直接注入(inject) Controller ,而是尝试创建一个包含业务逻辑的
在 MVC 中,ModelValidatorProvider被实例化并调用以验证每个请求的模型。这意味着在 DI 环境中,它可以依赖于单个请求范围内的对象,例如工作单元或数据库上下文。在 Web AP
我正在尝试部署使用 Unity 作为 IoC 容器的 ASP.NET MVC 3 应用程序。应用程序在本地服务器上运行良好,但在部署时会抛出异常:没有为此对象定义无参数构造函数。这是针对应该获取由我的
我正在遵循 this website 上描述的程序为了设置一个 Unity 依赖解析器以将依赖注入(inject)到我的 Controller 之一中。此代码运行良好: var container =
我正在构建一个 ASP MVC 3 应用程序,我在其中使用 Unity 作为 IOC 容器并将其注册到 DependencyResolver。在我的 Controller 中,我可以这样做: Depe
我是一名优秀的程序员,十分优秀!