.NET Core 中的 Unity InterfacesInterceptor
Unity InterfacesInterceptor in .NET Core
我会先从问题开始,然后是上下文:
- 是否有与 .NET Core 兼容的 Unity.Interception 版本可用?
- 是否有 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 中完全停产。
不幸的是,您必须使用第三方库,例如:
- Unity 分支:https://www.nuget.org/packages/Unity.Interception.NetCore/
- 朵拉拦截:https://www.nuget.org/packages/Dora.Interception/ it has a detailed usage documentation here.
我会先从问题开始,然后是上下文:
- 是否有与 .NET Core 兼容的 Unity.Interception 版本可用?
- 是否有 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 中完全停产。
不幸的是,您必须使用第三方库,例如:
- Unity 分支:https://www.nuget.org/packages/Unity.Interception.NetCore/
- 朵拉拦截:https://www.nuget.org/packages/Dora.Interception/ it has a detailed usage documentation here.