【发布时间】:2016-06-08 19:05:22
【问题描述】:
下面是我的不同类声明以及我如何尝试设置统一容器配置以获取具体类实现的接口。该代码当前抛出 stackoverflow 异常或提示无法构造接口。
请帮我修复类结构或容器配置。
CodesController 类 -
public class CodesController : ApiController
{
private readonly IUnitOfWorkAsync unitOfWork;
private readonly ICodeRepository repository;
public CodesController(IUnitOfWorkAsync unitOfWork, ICodeRepository codeRepository)
{
if (unitOfWork == null)
{
throw new ArgumentNullException("unitOfWork");
}
this.unitOfWork = unitOfWork;
this.repository = codeRepository;
}
//Other class level methods here
}
CodeRepository 类 -
public class CodeRepository : ICodeRepository
{
private readonly ICodeRepository codeRepository;
public CodeRepository(ICodeRepository repository)
{
this.codeRepository = repository;
}
public virtual async Task<IEnumerable<Code>> GetCodeAsync(string codeKey)
{ //Some implementation here}
}
ICodeRepository 接口 -
public interface ICodeRepository : IRepositoryAsync<Code>
{
Task<IEnumerable<Code>> GetCodeAsync(string codeKey);
}
IRepositoryAsync Interface -
public interface IRepositoryAsync<TEntity> : IRepository<TEntity> where TEntity : class, IPersistenceHint
{
Task<bool> DeleteAsync(params object[] keyValues);
Task<bool> DeleteAsync(CancellationToken cancellationToken, params object[] keyValues);
Task<TEntity> FindAsync(params object[] keyValues);
Task<TEntity> FindAsync(CancellationToken cancellationToken, params object[] keyValues);
}
Unity 容器配置-
container.RegisterType<IUnitOfWorkAsync, UnitOfWork>(
"test",
new TransientLifetimeManager(),
new InjectionConstructor(container.Resolve<IDataContextAsync>("test")));
container.RegisterType<ICodeRepository, CodeRepository>();
container.RegisterType<CodesController, CodesController>();
使用这个给定的配置和类结构,根据我对容器配置的实验,我得到以下异常 -
JSON exceptionMessage=尝试创建类型为“CodesController”的控制器时发生错误。确保控制器有一个无参数的公共构造函数。 exceptionType=System.InvalidOperationException 内部异常 exceptionMessage=Type '.Api.Controllers.CodesController' 没有默认构造函数 stackTrace= 在 System.Linq.Expressions.Expression.New(类型类型) 在 System.Web.Http.Internal.TypeActivator.Create[TBase](类型 instanceType)在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage 请求,类型控制器类型,Func`1& 激活器) 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor 控制器描述符,类型控制器类型)
如果这里有什么问题,请提出建议,以便我可以修复。已经为此苦苦挣扎了很多天。
【问题讨论】:
-
请显示异常详情
-
在原始问题中添加了上述异常详细信息。希望有帮助
-
另见this question,我特别喜欢this article的答案。
标签: c#-4.0 interface asp.net-web-api2 unity-container decorator