当前位置: 首页 > 知识库问答 >
问题:

使用Autofac注册通用接口和类

杜苏燕
2023-03-14

我当前的Autofac配置正在WebApi中解析我的APIController。

我正在努力的地方是,我试图创建一个具有通用构造函数参数的“BaseApiController”,但遇到了以下异常:

使用构造函数查找器“Autofac”,找不到类型为“Service”“1[WorldRegion]”的构造函数。果心激活剂。反射DefaultConstructorFinder’。

以下是代码结构:

public interface IEntityKey { }
public class WorldRegion : IEntityKey { }
public interface IRepository<T> where T : IEntityKey { }
public interface IService<T> where T : IEntityKey { }
public abstract class Service<T> : IService<T> where T : IEntityKey { }
public interface IWorldRegionService : IService<WorldRegion> { }
public class WorldRegionService : Service<WorldRegion>, IWorldRegionService
{
    private readonly IRepository<WorldRegion> _repository;
}

工作API控制器:

public class WorldRegionsController : BaseApiController
{
    private readonly IWorldRegionService _worldRegionService;
    private readonly ICultureService _cultureService;

    public WorldRegionsController(IWorldRegionService worldRegionService, ICultureService cultureService)
    {
        _worldRegionService = worldRegionService;
        _cultureService = cultureService;
    }
}

正在工作的Autofac配置:

public static void Register(HttpConfiguration config, IAppBuilder app)
{
    var builder = new ContainerBuilder();
    builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

    RegisterTypes(builder);

    var container = builder.Build();
    config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

    app.UseAutofacMiddleware(container);
    app.UseAutofacWebApi(config);
}

public static void RegisterTypes(ContainerBuilder builder)
{
    // Context
    builder.RegisterType<DataContext>().As<IDataContext>().InstancePerRequest();
    // UOW
    builder.RegisterType<UnitOfWork>().As<IUnitOfWork>().InstancePerRequest();
    // Repositories
    builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)).InstancePerRequest();
    // Services
    builder.RegisterType<CultureService>().As<ICultureService>().InstancePerRequest();
    builder.RegisterType<WorldRegionService>().As<IWorldRegionService>().InstancePerRequest();
}

以下是一般尝试:

// BaseApiController
public abstract class BaseApiController<T> : ApiController where T : IEntityKey

{
    protected readonly IService<T> _service;
    protected readonly ICultureService _cultureService;
    public BaseApiController(IService<T> service, ICultureService cultureService)
    {
        _service = service;
        _cultureService = cultureService;
    }
}

// ApiController
public class WorldRegionsController : BaseApiController<WorldRegion>
{
    public WorldRegionsController(
        IService<WorldRegion> service, ICultureService cultureService)
            : base(service, cultureService) {}
}

// Added to Autofac config
builder.RegisterGeneric(typeof(Service<>)).As(typeof(IService<>)).InstancePerRequest();
// Removed
builder.RegisterType<WorldRegionService>().As<IWorldRegionService>().InstancePerRequest();

通过此更改,我得到了上面提到的异常消息(黄色)。我想我在Autofac配置中遗漏了一些东西,只是不确定是什么。可能会以某种方式包括/注册/添加“WorldRegion”。

我应该如何注册我的类型?

共有2个答案

穆鸿卓
2023-03-14

起初,我尝试从Service中删除摘要

builder.RegisterAssemblyTypes(typeof(Service<>).Assembly)
       .Where(t => t.Name.EndsWith("Service")).AsImplementedInterfaces();

我尝试了Cyril对生成器的实现。RegisterAssemblyTypes()但是这个。GetAssemblys()不可用。我必须使用完整路径,这也可以:

builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
       .AsClosedTypesOf(typeof(IService<>));

需要注意的是,使用构建器中的任何一个。注册表类型()服务

// THIS DOES NOT WORK..!!!! Must remove 'abstract' from this class.
public abstract class WorldRegionService {}

因此,以上两种都是构建器。RegisterTypes()工作。

解晟睿
2023-03-14

您的控制器需要IService

builder.RegisterGeneric(typeof(Service<>)).As(typeof(IService<>)).InstancePerRequest();

所以它试图创建一个服务

不要忘记IWorldRealonServiceIService

您不想注册通用服务,但想将所有子项注册为iSeries设备

builder.RegisterAssemblyTypes(this.GetAssemblies())
       .AsClosedTypesOf(typeof(IService<>));

有关详细信息以及如何在IIS中正确实现GetAssembly方法,请阅读Autofac文档-程序集扫描。

 类似资料:
  • 我正在建立一个基于CQRS的系统。Net Core 2.1应用程序,使用Autofac和MediatR。 当我将命令馈送给mediator时,它工作得非常好,命令处理程序上的Handle()被执行。 如果我这样执行事情就不太顺利了 例外情况: 未处理的异常:系统。InvalidOperationException:为MediatR类型的请求构造处理程序时出错。IRequestHandler2[Ba

  • 问题内容: 假设我想定义一个接口,该接口代表对远程服务的调用。现在,对远程服务的调用通常会返回一些信息,但也可能包含输入参数。假设一个实现类通常只实现一个服务方法。鉴于上述信息,以下是一个较差的设计(感觉不太正确): 现在,让我们用一个类执行该接口,该类使用输入参数执行远程服务: 关于上述问题,我有两个问题: 如果要提供需要不同输入参数和接口方法返回类型的子类,则使用通用接口()是否合适? 我该如

  • 问题内容: 我正在尝试将Spring IoC与这样的接口一起使用: Spring可以基于通用类型参数T提供IoC吗?我的意思是这样的: 当然,上面的例子不起作用: 我的问题:是否可以提供对接口或实现类进行最少修改的类似功能?例如,我知道我可以使用@Qualifiers,但我想使事情尽可能简单。 问题答案: 由于擦除,我认为这是不可能的。在进行全自动布线时,我们通常切换到强类型子接口: 进行此切换后

  • 本文向大家介绍TypeScript 通用接口,包括了TypeScript 通用接口的使用技巧和注意事项,需要的朋友参考一下 示例 声明通用接口 具有多个类型参数的通用接口 实施通用接口 用泛型类实现它: 用非泛型类实现它:            

  • 我已经在我的本地机器中用Keycloak设置了一个web应用程序。由于Im使用Keycloak作为SSO实现,我希望在我的web应用程序中,无论何时单击注册按钮,用户都被引导到注册页面,而不是通过登录页面。 这是指向注册表单的示例URL,但是,它包含一个,它像会话ID一样随机生成。 https://site.test/auth/realms/custom/login-actions/authent