Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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# 统一泛型接口和具体类_C#_.net_Asp.net Web Api_Unity Container - Fatal编程技术网

C# 统一泛型接口和具体类

C# 统一泛型接口和具体类,c#,.net,asp.net-web-api,unity-container,C#,.net,Asp.net Web Api,Unity Container,我有一个通用存储库接口 IRepositroy<T> 然后我有了具体的存储库类来实现这些接口 public class CarRepo : RepositoryBase, IRepository<Car> ... 公共类CarRepo:RepositoryBase,IRepository。。。 我试图用unity将它们注入我的WebApi控制器,但没有成功 我得到一个错误,说我没有一个无参数的ctor,并且它无法将CarRepo转换为类型IRepository 在我

我有一个通用存储库接口

IRepositroy<T>
然后我有了具体的存储库类来实现这些接口

public class CarRepo : RepositoryBase, IRepository<Car> ...
公共类CarRepo:RepositoryBase,IRepository。。。
我试图用unity将它们注入我的WebApi控制器,但没有成功

我得到一个错误,说我没有一个无参数的ctor,并且它无法将CarRepo转换为类型IRepository

在我的容器配置中,我有:

container.RegisterType(typeof(IRepository<>), typeof(CarRepo));
container.RegisterType(typeof(IRepository),typeof(CarRepo));
下面是我在绑定到该控制器方法时得到的结果:


{“Message”:“出现错误”。,“ExceptionMessage”:“尝试创建类型为“CarController”的控制器时出错。请确保该控制器具有无参数公共构造函数。”,“ExceptionType”:“System.InvalidOperationException”,“StackTrace”:“at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.create”(HttpRequestMessage请求,HttpControllerDescriptor controllerDescriptor,Type controllerType)\r\n位于System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage请求)\r\n位于System.Web.Http.Dispatcher.HttpControllerDispatcher.d_1.MoveNext(),“InnerException”:{“消息”:“发生错误”,“异常消息”:“解析依赖项失败,类型=\“CarController\”,名称=\“(无)”。\r\n解析构造函数CareController的参数“repository\”时发生异常(IRepository
1[[CarRepository,DAL,Version=1.0.0,Culture=neutral,PublicKeyToken=null]]存储库)。\r\n异常为:InvalidCastException-无法将类型为“CarRepository”的对象强制转换为类型为“IRepository
1[Repository]”。\r\n---------------------------------------------------------------------\r\n发生异常时,容器为:\r\n\r\n正在解析CarController,(无)\r\n正在解析构造函数CarController的参数“Repository\”(IRepository
1[[CarRepository,Version=1.0.0,Culture=neutral,PublicKeyToken=null]]存储库)\r\n,“ExceptionType”:“Microsoft.Practices.Unity.ResolutionFailedException”,“StackTrace”:“在Microsoft.Practices.Unity.UnityContainer.DoBuildUp(类型t,对象存在,字符串名称,IEnumerable
1 Resolverrides)\r\n位于Microsoft.Practices.Unity.UnityContainer.Resolve(类型t,字符串名称,ResolverOverride[]resolverOverrides)\r\n位于Microsoft.Practices.Unity.UnityContainerExtensions.Resolve(IUnityContainer容器,类型t,ResolverOverride[]覆盖)\r\n位于Unity.WebApi.UnityDependencyScope.GetService(类型serviceType)\r\n位于System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceActiver(HttpRequestMessage请求,类型controllerType,Func
1&activator)\r\n位于System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage请求,HttpControllerDescriptor controllerDescriptor,类型controllerType),“InnerException”:{“消息”:“出现错误。”,“ExceptionMessage”:“无法将类型为“CarRepository”的对象强制转换为类型为“IRepository
1[CarRepository]”。在lambda_方法(闭包,IBuilderContext)处,“ExceptionType”:“System.InvalidCastException”,“StackTrace”:”\r\n在Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext.c\u DisplayClass1.b\u 0(IBuilderContext上下文)\r\n在Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.Building(IBuilderContext上下文)\r\n在Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext上下文)\r\n在Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext上下文)\r\n在Microsoft.Practices.Unity.UnityContainer.DoBuildUp(类型t,对象存在,字符串名称,IEnumerable`1 ResolverVerides)}

评论中的帖子是NightOwl888的复制品,这篇帖子略有不同,但它显示了正确的实现。您需要在RepositoryBase类中使用构造函数。(public RepositoryBase(){})


这基本上确保了抽象类有一个默认实现。

我也这么认为,可能是重复的,但该post引用了container.Register方法,UnityContainer类型不存在该方法
container.RegisterType(typeof(IRepository<>), typeof(CarRepo));