Сначала я начну с вопросов, а затем перейду к контексту:
- Доступна ли версия Unity.Interception, совместимая с .NET Core?
- Существует ли альтернатива 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: пакет Unity.Interception 4.0.1 несовместим с netcoreapp1.1 (.NETCoreApp, версия = v1.1). Пакет Unity.Interception 4.0.1 поддерживает: net45 (.NETFramework, Version=v4.5 )
Я попытался обойти это, добавив net451 в список PackageTargetFallback
:
<PackageTargetFallback>$(PackageTargetFallback);net451;dnxcore50;portable-net451+win8</PackageTargetFallback>
Это позволило мне установить пакет, но потом яростно жалуется на необходимость ссылки на mscorlib
:
Ошибка CS0012
Тип "Тип" определен в сборке, на которую нет ссылок. Вы должны добавить ссылку на сборку «mscorlib, версия = 4.0.0.0, культура = нейтральная, 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;
}