Autofac.Extras.DynamicProxy在公共接口

时间:2018-02-21 08:18:55

标签: c# dependency-injection autofac castle-dynamicproxy

我有公共接口和内部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不能使用接口拦截,因为它提供的服务不是公开可见的接口。检查组件的注册,以确保您不启用拦截并将其注册为内部/专用接口类型。

为什么我收到此错误?我的界面是公开的。

1 个答案:

答案 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()电话,则代码将有效。