我是Simple Injector IOC容器的新手。我將開始在一個需要使用MVC 4 ASP.NET Web API的多租戶ASP.NET MVC實現的項目中工作。Simple Injector是否支持MVC 4 ASP.NET Web API?
我的問題是:簡單注入器是否支持MVC 4 ASP.NET Web API?閱讀簡單的注入器文檔,如this引用了MVC 3,我想知道是否也支持MVC 4。
我是Simple Injector IOC容器的新手。我將開始在一個需要使用MVC 4 ASP.NET Web API的多租戶ASP.NET MVC實現的項目中工作。Simple Injector是否支持MVC 4 ASP.NET Web API?
我的問題是:簡單注入器是否支持MVC 4 ASP.NET Web API?閱讀簡單的注入器文檔,如this引用了MVC 3,我想知道是否也支持MVC 4。
簡單注入器IOC是否支持MVC 4 ASP.NET Web API?
它目前不支持MVC4 Web API,但支持將在未來添加。發生這種情況時,將更新The integration guide。
UPDATE:Web API support已經被添加到簡單的注射器2.5。
與此同時,您可以爲Simple Injector創建自己的System.Web.Http.Dependencies.IDependencyResolver
實現。下面是在IIS託管環境中使用Web API工作的實施:
public class SimpleInjectorHttpDependencyResolver :
System.Web.Http.Dependencies.IDependencyResolver
{
private readonly Container container;
public SimpleInjectorHttpDependencyResolver(
Container container)
{
this.container = container;
}
public System.Web.Http.Dependencies.IDependencyScope
BeginScope()
{
return this;
}
public object GetService(Type serviceType)
{
IServiceProvider provider = this.container;
return provider.GetService(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
IServiceProvider provider = this.container;
Type collectionType = typeof(IEnumerable<>).MakeGenericType(serviceType);
var services =(IEnumerable<object>)this.ServiceProvider.GetService(collectionType);
return services ?? Enumerable.Empty<object>();
}
public void Dispose()
{
}
}
這實現實現沒有範圍,因爲你需要使用Per Web Api Request壽命爲Web託管環境中實現的作用域(其中一個請求可能結束在不同於它開始的線程上)。
Because of the way Web API is designed,明確註冊所有Web API控制器非常重要。您可以使用下面的代碼做到這一點:
var services = GlobalConfiguration.Configuration.Services;
var controllerTypes = services.GetHttpControllerTypeResolver()
.GetControllerTypes(services.GetAssembliesResolver());
foreach (var controllerType in controllerTypes)
{
container.Register(controllerType);
}
如下您可以註冊SimpleInjectorHttpDependencyResolver
:
// NOTE: Do this as last step, after registering the controllers.
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorHttpDependencyResolver(container);
感謝您的回覆。 – user1489941
我的另一個問題是:使用簡單的注射器可以避免反射嗎? – user1489941
cue中的代碼更正:'GetAllInstance'更正爲'GetAllInstances'。不幸的是,SO需要6個以上的字符才能進行編輯,但有人應該告訴他們*對於代碼*,計算機是不可寬恕的,應該抓住並編輯這些錯別字。 –
簡短的回答是:是的,它的工作原理。下面的代碼片段,與兩臺Web API和MVC4控制器(部分基於史蒂芬的響應以上)爲我的項目工程:
var container = new Container();
//Register you types in container here
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.RegisterMvcAttributeFilterProvider();
var controllerTypes =
from type in Assembly.GetExecutingAssembly().GetExportedTypes()
where typeof(ApiController).IsAssignableFrom(type)
where !type.IsAbstract
where !type.IsGenericTypeDefinition
where type.Name.EndsWith("Controller", StringComparison.Ordinal)
select type;
foreach (var controllerType in controllerTypes)
{
container.Register(controllerType);
}
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
要訪問您的類型,你可以使用下面的代碼片段的API控制器:
DependencyResolver.Current.GetService<InterfaceName>()
Simple Injector 2.5包含一個[Web API集成包](https://simpleinjector.codeplex.com/wikipage?title=Web%20API%20Integration)。 – Steven