我目前有一个常见的空接口(比如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)。我怎么能这样做?
答案 0 :(得分:1)
您的代码将是"只是工作"。这是因为UserService
实现IService
,符合Any
检查。 AsImplementedInterfaces
可确保UserService
IService
注册IUserService
。
因此,如果您将IUserService
作为依赖项注入,则应解析UserService
。
您可以改进的一件事(尽管除了加快代码示例并使其更加清晰之外,它不会做任何其他事情)是调整您的呼叫:
i.IsAssignableFrom(typeof(IService))
代码的那部分可能没有按照你想的那样做。
我怀疑你想要它做的是回答问题 - i
是继承还是实施IService
。
但实际上它是反过来的,它询问IService
是继承还是实现i
(或者即使i
是IService
)。不幸的是,满足该条件的i
的唯一值是IService
本身。
为了更清楚这一点,请交换订单:
var serviceType = typeof(IService);
builder.RegisterAssemblyTypes(assemblies)
.Where(t => t.GetInterfaces().Any(i => serviceType .IsAssignableFrom(i)))
.AsImplementedInterfaces();
在您的代码示例的上下文中,您的代码形式确实有效(因为我们知道IService
将从GetInterfaces
返回) - 但它需要一些想要理解它的工作原理。如果您如图所示反转它们,则代码更容易理解。