【问题标题】:Setting proper Unity Container configuration for resolving interface-class in decorator pattern设置适当的 Unity Container 配置以解析装饰器模式中的接口类
【发布时间】: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


【解决方案1】:

您将ICodeRepository 注入CodeRepository,这可能会导致stackoverflow 异常,因为它会继续生成ICodeRepositories。它将生成一个递归调用。有点像这个:

public class BaseFoo
{
    public BaseFoo(BaseFoo foo){ }
}

public class Foo : BaseFoo
{
    public Foo() : base(new Foo()) { }
}

关于“没有默认构造函数”的异常,您是否为 Web API 注册了DependencyResolver?有关如何操作的更多详细信息,请参阅以下问题之一:

Using Unity with Web Api 2 gives error does not have a default constructor

Unity.WebApi | Make sure that the controller has a parameterless public constructor

ASP.Net MVC 4 Web API controller dosn't work with Unity.WebApi

附带说明,您不必在统一注册中注册 CodesController

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 2011-12-15
    • 2015-11-11
    • 1970-01-01
    • 2012-06-20
    • 2011-07-17
    • 2011-09-05
    相关资源
    最近更新 更多