Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Autofac通过接口解析';s接口_C#_Asp.net - Fatal编程技术网

C# Autofac通过接口解析';s接口

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

我目前有一个常见的空接口(比如iSeries)。 我有很多接口是从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 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
返回),但是要理解它为什么有效需要一些思考。如果按图所示反转,代码会稍微容易理解。

是的,这就是我不明白的地方,谢谢你帮我整理