C# Autofac通过接口解析';s接口
我目前有一个常见的空接口(比如iSeries)。 我有很多接口是从IService派生出来的,并在以后的实现中使用,例如:C# Autofac通过接口解析';s接口,c#,asp.net,C#,Asp.net,我目前有一个常见的空接口(比如iSeries)。 我有很多接口是从IService派生出来的,并在以后的实现中使用,例如: interface IUserService : IService { } class UserService : IUserService 我试过的是 builder.RegisterAssemblyTypes(assemblies) .Where(t => t.GetInterfaces().Any(i => i.IsAssigna
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 iSeries)。我该怎么做?回答:
您的代码将“正常工作”。这是因为UserService
实现了IService
,它满足Any
检查。而AsImplementedInterfaces
确保UserService
同时针对IService
和IUserService
注册
因此,如果将IUserService
作为依赖项注入,则应该解决UserService
问题
需要考虑的额外内容:
您可以改进的一件事(尽管除了加快代码示例并使其更清晰外,它不会做任何事情)是调整您的调用:
i.IsAssignableFrom(typeof(IService))
代码的这一部分可能没有做您认为它正在做的事情
我怀疑您希望它做的是回答以下问题:I
是否继承或实现了iSeries设备
但它实际上是以另一种方式进行的,它询问iSeries是否继承或实现了i
(或者即使i
是iSeries
)。不幸的是,i
满足该条件的唯一值是iSeries设备本身
为了更清楚地说明这一点,请交换订单:
var serviceType = typeof(IService);
builder.RegisterAssemblyTypes(assemblies)
.Where(t => t.GetInterfaces().Any(i => serviceType .IsAssignableFrom(i)))
.AsImplementedInterfaces();
在您的代码示例的上下文中,您的代码形式实际上是有效的(因为我们知道,IService
将从GetInterfaces
返回),但是要理解它为什么有效需要一些思考。如果按图所示反转,代码会稍微容易理解。是的,这就是我不明白的地方,谢谢你帮我整理