Autofac通过接口的界面解析

时间:2018-02-15 11:10:39

标签: c# asp.net

我目前有一个常见的空接口(比如IService)。 我有很多接口,它们来自IService,后来被实现使用,例如:

interface IUserService : IService { }
class UserService : IUserService

我试过的是那个

builder.RegisterAssemblyTypes(assemblies)
            .Where(t => t.GetInterfaces().Any(i => i.IsAssignableFrom(typeof(IService))))
            .AsImplementedInterfaces();

但它只在我直接在实现上派生IService时工作,但我有一个更具体的接口(例如IUserService)。 我需要为每个接口实现注册类型(IUserService-UserService with IService)。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

答案:

您的代码将是"只是工作"。这是因为UserService实现IService,符合Any检查。 AsImplementedInterfaces可确保UserService IService注册IUserService

因此,如果您将IUserService作为依赖项注入,则应解析UserService

要考虑的额外内容:

您可以改进的一件事(尽管除了加快代码示例并使其更加清晰之外,它不会做任何其他事情)是调整您的呼叫:

i.IsAssignableFrom(typeof(IService))

代码的那部分可能没有按照你想的那样做

我怀疑你想要它做的是回答问题 - i是继承还是实施IService

但实际上它是反过来的,它询问IService是继承还是实现i(或者即使iIService)。不幸的是,满足该条件的i的唯一值是IService本身。

为了更清楚这一点,请交换订单:

var serviceType = typeof(IService);
builder.RegisterAssemblyTypes(assemblies)
            .Where(t => t.GetInterfaces().Any(i => serviceType .IsAssignableFrom(i)))
            .AsImplementedInterfaces();

在您的代码示例的上下文中,您的代码形式确实有效(因为我们知道IService将从GetInterfaces返回) - 但它需要一些想要理解它的工作原理。如果您如图所示反转它们,则代码更容易理解。