如何注册通用存储库的依赖关系?

ot谷

我有以下存储库库:

public class FakeRepositoryBase<TEntity, TPrimaryKey> : AbpRepositoryBase<TEntity, TPrimaryKey>
    where TEntity : class, IEntity<TPrimaryKey>
{...}

并继承自第一个:

public class FakeRepositoryBase<TEntity> : FakeRepositoryBase<TEntity, int>, IRepository<TEntity>
    where TEntity : class, IEntity<int>
{...}

模块注册:

[DependsOn(typeof(AbpKernelModule))]
public class DERCFakeDALModule: AbpModule
{
    public override void Initialize()
    {
        IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
    }
}

然后我声明AppService:

class DocumentAppService : ApplicationService, IDocumentAppService
{
    private readonly IRepository<Document> _documentRepository;
    private readonly IObjectMapper _objectMapper;

    public DocumentAppService(
        IRepository<Document> documentRepository,
        IObjectMapper objectMapper)
    {
        _documentRepository = documentRepository;
        _objectMapper = objectMapper;
    }

    // AppService methods
}

并将所有依赖项添加到我的WebModule中:

[DependsOn(
        typeof(AbpWebMvcModule),
        typeof(DERCApplicationModule), 
        typeof(DERCWebApiModule),
        typeof(DERCFakeDALModule))]
public class DERCWebModule : AbpModule

调用任何API方法后,都会出现错误:

{
  "message": "An error has occurred.",
  "exceptionMessage": "ComponentActivator: could not proxy Abp.WebApi.Controllers.Dynamic.DynamicApiController`1[[DERC.ApplicationServices.Interfaces.IDocumentAppService, DERC.Application, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]",
  "exceptionType": "Castle.MicroKernel.ComponentActivator.ComponentActivatorException",
  "stackTrace": "   в Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.CreateInstance(CreationContext context, ConstructorCandidate constructor, Object[] arguments)\r\n   в Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.Instantiate(CreationContext context)\r\n   в Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.InternalCreate(CreationContext context)\r\n   в Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.Create(CreationContext context, Burden burden)\r\n   в Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.CreateInstance(CreationContext context, Boolean trackedExternally)\r\n   в Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.Resolve(CreationContext context, IReleasePolicy releasePolicy)\r\n   в Castle.MicroKernel.Handlers.DefaultHandler.ResolveCore(CreationContext context, Boolean requiresDecommission, Boolean instanceRequired, Burden& burden)\r\n   в Castle.MicroKernel.Handlers.DefaultHandler.Resolve(CreationContext context, Boolean instanceRequired)\r\n   в Castle.MicroKernel.Handlers.AbstractHandler.Resolve(CreationContext context)\r\n   в Castle.MicroKernel.DefaultKernel.ResolveComponent(IHandler handler, Type service, IDictionary additionalArguments, IReleasePolicy policy)\r\n   в Castle.MicroKernel.DefaultKernel.Castle.MicroKernel.IKernelInternal.Resolve(Type service, IDictionary arguments, IReleasePolicy policy)\r\n   в Castle.MicroKernel.DefaultKernel.Resolve(Type service, IDictionary arguments)\r\n   в Castle.Windsor.WindsorContainer.Resolve(Type service)\r\n   в Abp.Dependency.IocManager.Resolve(Type type)\r\n   в Abp.Dependency.IocResolverExtensions.ResolveAsDisposable[T](IIocResolver iocResolver, Type type)\r\n   в Abp.WebApi.Controllers.AbpApiControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n   в System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n   в System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()",
  "innerException": {
    "message": "An error has occurred.",
    "exceptionMessage": "Can't create component 'DERC.ApplicationServices.DocumentAppService' as it has dependencies to be satisfied.\r\n\r\n'DERC.ApplicationServices.DocumentAppService' is waiting for the following dependencies:\r\n- Service 'Abp.Domain.Repositories.IRepository`1[[DERC.Entities.Document, DERC.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]]' which was not registered.\r\n",
    "exceptionType": "Castle.MicroKernel.Handlers.HandlerException",
    "stackTrace": "   в Castle.MicroKernel.Handlers.DefaultHandler.AssertNotWaitingForDependency()\r\n   в Castle.MicroKernel.Handlers.DefaultHandler.ResolveCore(CreationContext context, Boolean requiresDecommission, Boolean instanceRequired, Burden& burden)\r\n   в Castle.MicroKernel.Handlers.DefaultHandler.Resolve(CreationContext context, Boolean instanceRequired)\r\n   в Castle.MicroKernel.Handlers.AbstractHandler.Resolve(CreationContext context)\r\n   в Castle.MicroKernel.Resolvers.DefaultDependencyResolver.ResolveFromKernelByType(CreationContext context, ComponentModel model, DependencyModel dependency)\r\n   в Castle.MicroKernel.Resolvers.DefaultDependencyResolver.ResolveFromKernel(CreationContext context, ComponentModel model, DependencyModel dependency)\r\n   в Castle.MicroKernel.Resolvers.DefaultDependencyResolver.ResolveCore(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)\r\n   в Castle.MicroKernel.Resolvers.DefaultDependencyResolver.Resolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)\r\n   в Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.CreateConstructorArguments(ConstructorCandidate constructor, CreationContext context)\r\n   в Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.Instantiate(CreationContext context)\r\n   в Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.InternalCreate(CreationContext context)\r\n   в Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.Create(CreationContext context, Burden burden)\r\n   в Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.CreateInstance(CreationContext context, Boolean trackedExternally)\r\n   в Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.Resolve(CreationContext context, IReleasePolicy releasePolicy)\r\n   в Castle.MicroKernel.Handlers.DefaultHandler.ResolveCore(CreationContext context, Boolean requiresDecommission, Boolean instanceRequired, Burden& burden)\r\n   в Castle.MicroKernel.Handlers.DefaultHandler.Resolve(CreationContext context, Boolean instanceRequired)\r\n   в Castle.MicroKernel.Handlers.AbstractHandler.Resolve(CreationContext context)\r\n   в Castle.Core.InterceptorReference.Castle.MicroKernel.IReference<Castle.DynamicProxy.IInterceptor>.Resolve(IKernel kernel, CreationContext context)\r\n   в Castle.Windsor.Proxy.AbstractProxyFactory.ObtainInterceptors(IKernel kernel, ComponentModel model, CreationContext context)\r\n   в Castle.Windsor.Proxy.DefaultProxyFactory.Create(IKernel kernel, Object target, ComponentModel model, CreationContext context, Object[] constructorArguments)\r\n   в Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.CreateInstance(CreationContext context, ConstructorCandidate constructor, Object[] arguments)"
  }
}

我该如何解决这个问题?

扬·蒙辛斯基

检查什么基本约定注册时,您会看到:

        //Transient
        context.IocManager.IocContainer.Register(
            Classes.FromAssembly(context.Assembly)
                .IncludeNonPublicTypes()
                .BasedOn<ITransientDependency>()
                .If(type => !type.GetTypeInfo().IsGenericTypeDefinition)
                .WithService.Self()
                .WithService.DefaultInterfaces()
                .LifestyleTransient()
            );

        //Singleton
        context.IocManager.IocContainer.Register(
            Classes.FromAssembly(context.Assembly)
                .IncludeNonPublicTypes()
                .BasedOn<ISingletonDependency>()
                .If(type => !type.GetTypeInfo().IsGenericTypeDefinition)
                .WithService.Self()
                .WithService.DefaultInterfaces()
                .LifestyleSingleton()
            );

        //Windsor Interceptors
        context.IocManager.IocContainer.Register(
            Classes.FromAssembly(context.Assembly)
                .IncludeNonPublicTypes()
                .BasedOn<IInterceptor>()
                .If(type => !type.GetTypeInfo().IsGenericTypeDefinition)
                .WithService.Self()
                .LifestyleTransient()
            );

这意味着首先必须用ITransientDependencyISingletonDependency接口标记依赖项,以便能够按约定注册它们。然后无论如何泛型类型都会被排除,因此您必须通过标准方法注册它们:

IocManager.IocContainer.Register(Component.For(typeof(ITest<,>)).ImplementedBy(typeof(Test<,>)));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用带有私有存储库中的依赖关系的Go运行Google Cloud Function?

Spring Boot Test无法解决存储库依赖关系

删除GitHub存储库的fork依赖关系

如何将Bintray用户存储库(正确)用于gradle的依赖关系?

Cloudera存储库中最新的MRunit依赖关系

如何在存储库MVC6中注入ApplicationDbContext的依赖关系

域对象,工厂和存储库之间的依赖关系

Dapper的通用存储库

如何找到库的依赖关系?

Flutter:CocoaPods的规格存储库太旧了,无法满足依赖关系

在GitLab CI构建期间如何从私有GitLab Git存储库中提取NPM依赖关系

注册通用类的依赖注入

EF核心在通用存储库中有多对多关系

Gradle:如何为多种口味定义通用的依赖关系?

无法使用autofac解决通用存储库的依赖性

我如何测试具有本地依赖关系的TypeORM存储库方法

如何从autofac容器解析依赖关系(在嵌套LifetimeScope中注册)

Nest无法解析存储库的依赖关系

javers的Oracle存储库依赖关系

如何使用存储库限制关系线

注册所有通用存储库的所有依赖项注入

rpm如何解决库依赖关系?

如何解决共享库依赖关系?

使用反向端口存储库后未满足的依赖关系

Yum或Reposync:如何缓慢删除存储库而不会出现意外的依赖关系问题?

Composer VCS存储库未加载依赖关系

如何查找不在Linux发行版存储库中的源软件包的依赖关系?

注册通用存储库引发错误“提供的通用参数的数量不等于数量”

如何从通用存储库调用通用类