1

配置

我有 :

  • 一个 .net 核心 MVC 应用程序项目
  • 一个模块项目包含
    • 一个控制器(MyController),
    • 存储库接口(IMyRepository)
    • 一个存储库(实现 IMyRepository 和 IRepository 的 MyRepository)

.net 核心应用程序引用了模块项目

我在 MVC 应用程序中使用 Scrutor 来获取IRepositoy在任何引用项目中实现的所有类,并将它们注册到服务集合中:

public static void RegisterAllTypes<T>(this IServiceCollection services, ServiceLifetime lifetime = ServiceLifetime.Scoped)
{

    var entryAssembly = Assembly.GetEntryAssembly();
    var referencedAssemblies = entryAssembly.GetReferencedAssemblies().Select(Assembly.Load);
    var assemblies = new List<Assembly> { entryAssembly }.Concat(referencedAssemblies).ToArray();

    services.Scan(
        x =>
        {
            x.FromAssemblies(assemblies)
                .AddClasses(classes => classes.AssignableTo(typeof(T)))
                    .AsImplementedInterfaces()

                .WithLifetime(lifetime);
    });
}

问题

如果我检查服务集合,我可以看到IMyRepository已注册并且应该解析为MyRepository。但是,将存储库注入MyController时,如下所示:

private readonly IMyRepository _myRepository ;

public MyController(IMyRepository myRepository )
{
    _myRepository = myRepository;
}

抛出错误:

尝试激活“MyController”时无法解析“IMyRepository”类型的服务。

除非...

通过 Scrutor 注册存储库后,我把

var test = typeof(IMyRepository);

此时一切都按预期工作。但这破坏了自动依赖注册的全部意义。

非常感谢任何帮助。

4

1 回答 1

1

将注册方法更改为使用FromApplicationDependencies(),现在一切似乎都很好。

public static void RegisterAllTypes<T>(this IServiceCollection services, ServiceLifetime lifetime = ServiceLifetime.Scoped)
{
    services.Scan(
        x =>
        {
            x.FromApplicationDependencies()
                .AddClasses(classes => classes.AssignableTo(typeof(T)))
                    .AsImplementedInterfaces()
                    .WithLifetime(lifetime);
        });
}
于 2020-02-14T23:31:02.793 回答