C# Can';让Unity Bootstrapper为MVC工作
我用一个控制器创建了一个基本的WebAPI项目,并尝试使用NuGet提供的Unity MVC Bootstrapper包。不幸的是,当我尝试访问URL时,它抛出了错误 {“消息”:“发生错误”。,“异常消息”:“类型” “SE.FlexApplication.WebApi.Controllers.RunTypeController”不存在 违约 构造函数“,”异常类型“:”System.ArgumentException“,”堆栈跟踪“:” 位于System.Linq.Expressions.Expression.New(类型)\r\n位于 System.Web.Http.Internal.TypeActivator.Create[TBase](类型 instanceType)\r\n位于 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceActivator(HttpRequestMessage 请求,类型controllerType,Func`1&activator)\r\n位于 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor控制器描述符,类型 控制器类型)“} 我的控制器类C# Can';让Unity Bootstrapper为MVC工作,c#,model-view-controller,asp.net-web-api,unity-container,C#,Model View Controller,Asp.net Web Api,Unity Container,我用一个控制器创建了一个基本的WebAPI项目,并尝试使用NuGet提供的Unity MVC Bootstrapper包。不幸的是,当我尝试访问URL时,它抛出了错误 {“消息”:“发生错误”。,“异常消息”:“类型” “SE.FlexApplication.WebApi.Controllers.RunTypeController”不存在 违约 构造函数“,”异常类型“:”System.ArgumentException“,”堆栈跟踪“:” 位于System.Linq.Expressions.E
public class RunTypeController : ApiController
{
private readonly IStaticTypesRepository _staticTypesRepository;
private readonly IDataModelConverter _dataModelConverter;
private readonly IBusinessModelConverter _businessModelConverter;
public RunTypeController(IStaticTypesRepository staticTypesRepository, IDataModelConverter dataModelConverter, IBusinessModelConverter businessModelConverter)
{
_staticTypesRepository = staticTypesRepository;
_dataModelConverter = dataModelConverter;
_businessModelConverter = businessModelConverter;
}
public RunType[] Get()
{
return _staticTypesRepository.GetRunTypes().Select(r => _dataModelConverter.Convert(r)).ToArray();
}
public HttpResponseMessage Post(RunType type)
{
_staticTypesRepository.AddRunType(_businessModelConverter.Convert(type));
_staticTypesRepository.Save();
var response = Request.CreateResponse(System.Net.HttpStatusCode.Created, type);
return response;
}
}
和统一激活器
[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(SE.FlexApplication.WebApi.App_Start.UnityWebActivator), "Start")]
[assembly: WebActivatorEx.ApplicationShutdownMethod(typeof(SE.FlexApplication.WebApi.App_Start.UnityWebActivator), "Shutdown")]
namespace SE.FlexApplication.WebApi.App_Start
{
/// <summary>Provides the bootstrapping for integrating Unity with ASP.NET MVC.</summary>
public static class UnityWebActivator
{
/// <summary>Integrates Unity when the application starts.</summary>
public static void Start()
{
var container = UnityConfig.GetConfiguredContainer();
FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());
FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
/// <summary>Disposes the Unity container when the application is shut down.</summary>
public static void Shutdown()
{
var container = UnityConfig.GetConfiguredContainer();
container.Dispose();
}
}
}
[程序集:webactivatex.PreApplicationStartMethod(typeof(SE.FlexApplication.WebApi.App_Start.UnityWebActivator),“Start”)]
[程序集:WebActivatorEx.ApplicationShutdownMethod(typeof(SE.FlexApplication.WebApi.App_Start.UnityWebActivator),“Shutdown”)]
命名空间SE.FlexApplication.WebApi.App_Start
{
///提供用于将Unity与ASP.NET MVC集成的引导。
公共静态类UnityWebActivator
{
///在应用程序启动时集成Unity。
公共静态void Start()
{
var container=UnityConfig.GetConfiguredContainer();
FilterProviders.Providers.Remove(FilterProviders.Providers.OfType().First());
FilterProviders.Providers.Add(新UnityFilterAttributeFilterProvider(容器));
SetResolver(新UnitedDependencyResolver(容器));
}
///在应用程序关闭时处置Unity容器。
公共静态无效关机()
{
var container=UnityConfig.GetConfiguredContainer();
container.Dispose();
}
}
}
统一配置类
public class UnityConfig
{
#region Unity Container
private static readonly Lazy<IUnityContainer> Container = new Lazy<IUnityContainer>(() =>
{
var container = new UnityContainer();
RegisterTypes(container);
return container;
});
/// <summary>
/// Gets the configured Unity container.
/// </summary>
public static IUnityContainer GetConfiguredContainer()
{
return Container.Value;
}
#endregion
/// <summary>Registers the type mappings with the Unity container.</summary>
/// <param name="container">The unity container to configure.</param>
/// <remarks>There is no need to register concrete types such as controllers or API controllers (unless you want to
/// change the defaults), as Unity allows resolving a concrete type even if it was not previously registered.</remarks>
public static void RegisterTypes(IUnityContainer container)
{
try
{
//container.RegisterInstance<IUnitOfWork>(new ProdUnitOfWork());
container.RegisterType<IEventRepository, EventRepository>();
container.RegisterType<IModelRepository, ModelRepository>();
container.RegisterType<ISecurityRepository, SecurityRepository>();
container.RegisterType<IStaticTypesRepository, StaticTypesRepository>();
container.RegisterType<IDataModelConverter, DataToModelConverter>();
container.RegisterType<IBusinessModelConverter, ModelToDataConverter>();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
公共类UnityConfig
{
#区域统一容器
私有静态只读惰性容器=新惰性(()=>
{
var container=new UnityContainer();
注册类型(容器);
返回容器;
});
///
///获取已配置的Unity容器。
///
公共静态IUnityContainer GetConfiguredContainer()
{
返回容器。值;
}
#端区
///向Unity容器注册类型映射。
///要配置的unity容器。
///不需要注册控制器或API控制器等具体类型(除非您想注册)
///更改默认值),因为Unity允许解析具体类型,即使它以前没有注册。
公共静态无效注册表类型(IUnityContainer容器)
{
尝试
{
//container.RegisterInstance(新的ProdUnitOfWork());
container.RegisterType();
container.RegisterType();
container.RegisterType();
container.RegisterType();
container.RegisterType();
container.RegisterType();
}
捕获(例外情况除外)
{
控制台写入线(例如消息);
}
}
}
控制器似乎没有意识到应该使用Unity依赖项解析器进行构造函数注入。我已经完成了在线教程中的所有步骤。我错过了一些基本的东西吗?控制器似乎没有意识到应该使用Unity依赖项解析器进行构造函数注入。实际上,它使用的是IoC容器。似乎这些类型没有在用于解析的容器中注册。作为例行检查:是否已注册
StaticTypesRepository
DataToModelConverter`和ModelToDataConverter
(以及它们自己的依赖项)的所有依赖项?嗯,StaticTypesRepository需要IUnitOfWork,因此更改为取消注释上面的行,以便没有其他次要依赖项未注册。现在,我在上面Start()方法的末尾进行了检查,创建并注册了所有必需的类型。但是当我导航到/API/runtypeurl时,它试图创建仍然带有空构造函数的RunTypeController-即它给出相同的错误,如果我向控制器添加默认构造函数,它直接进入了它。在注册完所有类型之后,如何从IoC显式解析控制器?如果我添加var c=container.Resolve();在所有注册之后,它正确解析RunTypeController,并通过注入调用IOC构造函数。是否有一个工厂,MVC在被请求时用来创建控制器,需要重写或更新以使用Unity而不是只创建空白的控制器?当然,不完全是工厂,但引导程序上有BuildUnityContainer
方法。它由ASP.Net管道调用,并返回您配置的容器。(见附件)