Unity InterfacesInterceptor в .NET Core

Сначала я начну с вопросов, а затем перейду к контексту:

  1. Доступна ли версия Unity.Interception, совместимая с .NET Core?
  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: пакет 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;
}

person Sigurd Garshol    schedule 15.06.2017    source источник


Ответы (3)



К сожалению, вы должны использовать сторонние библиотеки, такие как:

person Major    schedule 03.09.2020

Кажется, DynamicProxy Castle.Core - это то, что мне нужно:

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;
    }
}
person Sigurd Garshol    schedule 16.06.2017