Сначала я хочу исправить неправильный оператор: можно выполнить msTest за пределами Visual Studio с помощью командной строки. Хотя несколько инструментов CI, таких как TeamCity имеют лучшую поддержку NUnit (вероятно, изменился бы, поскольку msTest становится более популярным). В моем текущем проекте мы используем обоих и единственное большое различие, которое мы нашли, то, что mstest всегда работает как 32 бита, в то время как NUnit работает или как тест на 64 бита или как на 32 бита, который только имеет значение, использует ли Ваш код собственный код, который является 32/64 иждивенцем.
Я только что ответил на этот вопрос в моем блоге .
См. Также http://lozanotek.com/blog/archive/2009/08/19 /Autowire_IHttpModules_with_IoC.aspx
Впервые я увидел внедрение зависимостей в HttpModules в Spring.NET (хотя и не рекламировал этот фреймворк). Идея состоит в том, что у вас есть специальный HttpModule, который внедряет зависимости в другие HttpModule-ы уровня приложения.
К сожалению, текущая версия Autofac.Integration.Web не поддерживает это, но вы можете легко сделать это самостоятельно :
public class MyModule : IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
Assert.IsNotNull(MyService);
}
public IMyService MyService { get; set; }
}
public class HttpModuleInjectionModule : IHttpModule
{
public void Dispose()
{
}
public void Init(HttpApplication context)
{
var containerProviderAccessor = context as IContainerProviderAccessor;
if(containerProviderAccessor == null)
throw new InvalidOperationException("HttpApplication should implement IContainerProviderAccessor");
var rootContainer = containerProviderAccessor.ContainerProvider.ApplicationContainer;
foreach (string moduleName in context.Modules.AllKeys)
rootContainer.InjectProperties(context.Modules[moduleName]);
}
}
public class Global : HttpApplication, IContainerProviderAccessor
{
static IContainerProvider _containerProvider;
protected void Application_Start(object sender, EventArgs e)
{
var builder = new ContainerBuilder();
builder.Register<MyService>().As<IMyService>();
_containerProvider = new ContainerProvider(builder.Build());
}
public IContainerProvider ContainerProvider
{
get { return _containerProvider; }
}
}
HttpModuleInjectionModule должен быть зарегистрирован раньше других HttpModule-ов в web.config:
<httpModules>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add name="HttpModuleInjection" type="WebTest.HttpModuleInjectionModule, WebTest"/>
<add name="ContainerDisposal" type="Autofac.Integration.Web.ContainerDisposalModule, Autofac.Integration.Web"/>
<add name="PropertyInjection" type="Autofac.Integration.Web.PropertyInjectionModule, Autofac.Integration.Web"/>
<add name="MyModule" type="WebTest.MyModule, WebTest"/>
</httpModules>
Я уверен, что вы можете делать аналогичные вещи в Windsor. Разница будет в том, как вы получаете доступ к корневому контейнеру из HttpModuleInjectionModule .
You could pass in the required dependencies via the HttpApplication context passed to you by the Init method...
public class MyHttpModule : IHttpModule
{
public void Init(HttpApplication context)
{
var dependency = (IDependency)context.Context.Items["dependency"];
// consume dependency...
}
public void Dispose()
{
}
}