.NET Core 中的 Unity InterfacesInterceptor

Unity InterfacesInterceptor in .NET Core

我会先从问题开始,然后是上下文:

  1. 是否有与 .NET Core 兼容的 Unity.Interception 版本可用?
  2. 是否有 Unity.Interception 的 .NET Core 兼容替代方案?

我正在考虑使用 Microsoft.Practices.Unity.InterceptionExtension.InterfaceInterceptor 来短路对某些接口的调用(下面的示例代码),但似乎建议的 NuGet 包 Unity.Interception 4.0.1 不是与 .NET Core 兼容。

我尝试在 Unity.Interception 4.0.1 的使用中进行鞋拔,因为使用的代码片段在经典 .NET 中工作正常;但如前所述,我 运行 陷入 .NET Core 的问题:

Install-Package : Package Unity.Interception 4.0.1 is not compatible with netcoreapp1.1 (.NETCoreApp,Version=v1.1). Package Unity.Interception 4.0.1 supports: net45 (.NETFramework,Version=v4.5 )

我试图通过将 net451 添加到 PackageTargetFallback 列表来规避此问题:

<PackageTargetFallback>$(PackageTargetFallback);net451;dnxcore50;portable-net451+win8</PackageTargetFallback>

这让我可以安装这个包,但它随后抱怨需要参考 mscorlib:

Error CS0012
The type 'Type' is defined in an assembly that is not referenced. You must add a reference to assembly 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'.

我不会尝试将经典 .NET 框架中的引用引用到 .NET Core 应用程序中,所以我在这里几乎陷入了死胡同。

示例代码:

public class Interceptions
{
    public static object CreateCustomInterceptedProxy(Type type)
    {
        var interceptor = new InterfaceInterceptor();

        var proxy = interceptor.CreateProxy(type, null);

        var interceptionBehavior = new CustomInterceptionBehavior();

        proxy.AddInterceptionBehavior(interceptionBehavior);

        return proxy;
    }
}

public class CustomInterceptionBehavior : IInterceptionBehavior
{
    public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
    {
        object response = null; // replace with stuff that builds an actual object

        return input.CreateMethodReturn(response, new object[] { });
    }

    public IEnumerable<Type> GetRequiredInterfaces()
    {
        return Type.EmptyTypes;
    }

    public bool WillExecute => true;
}

看来Castle.Core的DynamicProxy正是我所需要的:

using Castle.DynamicProxy;

public class CustomInterceptor : IInterceptor
{
    public static object CreateCustomInterceptedProxy(Type type)
    {
        var proxyGenerator = new ProxyGenerator();

        var interceptor = new Interceptor();

        var proxy = proxyGenerator.CreateInterfaceProxyWithoutTarget(type, interceptor);

        return proxy;
    }
}

public class CustomInterceptor : IInterceptor
{
    public void Intercept(IInvocation invocation)
    {
        object returnValue; // Do stuff to populate return value

        invocation.ReturnValue = returnValue;
    }
}

我知道这个问题是大约一个月前提出的,但我认为它也可能对其他开发人员有用(因为这对我来说是一场噩梦)。 我分叉了 Unity 项目并将其移植到 .Net Core 2.0。您可以在此存储库下找到它:

https://github.com/Chavoshi/Unity.NetCore

还有这些 nuget 包:

https://www.nuget.org/packages/Unity.NetCore/

https://www.nuget.org/packages/Unity.Interception.NetCore/

P.S: 我无法移植的唯一部分是 TransparentProxyInterception,它使用 .Net Remoting,它是在 .Net Core 中完全停产。

不幸的是,您必须使用第三方库,例如: