我有公共接口和内部impl,
public interface IService
{
...
}
internal class Service: IService
{
...
}
我是通过
注册的builder.RegisterAssemblyTypes(assembly)
.EnableInterfaceInterceptors()
.AsImplementedInterfaces()
.AsSelf()
但我收到错误
组件Activator = Service(ReflectionActivator),Services = [〜.IService,〜。Service], Lifetime = Autofac.Core.Lifetime.MatchingScopeLifetime,Sharing = Shared,Ownership = OwnedByLifetimeScope不能使用接口拦截,因为它提供的服务不是公开可见的接口。检查组件的注册,以确保您不启用拦截并将其注册为内部/专用接口类型。
为什么我收到此错误?我的界面是公开的。
答案 0 :(得分:2)
使用AsSelf()
方法时,容器将在当前注册的服务列表中添加具体类型。
错误消息是
无法使用界面拦截,因为它提供的服务不公开界面
这意味着注册的所有服务都应该是一个不是这种情况的接口。您可以在EnsureInterfaceInterceptionApplies method
中查看private static void EnsureInterfaceInterceptionApplies(IComponentRegistration componentRegistration)
{
if (componentRegistration.Services
.OfType<IServiceWithType>()
.Select(s => new Tuple<Type, TypeInfo>(s.ServiceType, s.ServiceType.GetTypeInfo()))
.Any(s => !s.Item2.IsInterface || !ProxyUtil.IsAccessible(s.Item1)))
{
throw new InvalidOperationException(
string.Format(
CultureInfo.CurrentCulture,
RegistrationExtensionsResources.InterfaceProxyingOnlySupportsInterfaceServices,
componentRegistration));
}
}
如果您删除.AsSelf()
电话,则代码将有效。