Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';让Unity Bootstrapper为MVC工作_C#_Model View Controller_Asp.net Web Api_Unity Container - Fatal编程技术网

C# Can';让Unity Bootstrapper为MVC工作

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

我用一个控制器创建了一个基本的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控制器描述符,类型 控制器类型)“}

我的控制器类

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管道调用,并返回您配置的容器。(见附件)