Откладывать (отложенное создание) или подавлять создание атрибутов обработчика вызовов Unity до тех пор, пока декорированный метод не будет фактически вызван

Я пытаюсь использовать атрибуты перехвата вызовов и атрибуты обработчика на моих интерфейсах (или реализации). Допустим, мой интерфейс имеет два метода DoSomething() и DoSomethingElse(), и у меня есть только перехватчик для DoSomethingElse(); когда я определяю свой основной интерфейс, вызывается конструктор для обработчика вызовов, даже если я никогда не вызываю DoSomethingElse().

Я попытался сделать это, решив Lazy(из IMainInterface), но в тот момент, когда я вызываю функцию DoSomething(), обработчик вызовов по-прежнему создается без необходимости. Есть ли способ, чтобы предотвратить это либо с помощью кода или конфигурации. Вот мой пример реализации

Атрибут обработчика и обработчик вызовов

<AttributeUsage(AttributeTargets.Method)>
Public Class NormalSampleAttribute
    Inherits HandlerAttribute
    Public Sub New()
            Console.WriteLine("Constructor of Normal Sample Attribute")
    End Sub

    Public Overrides Function CreateHandler(container As Microsoft.Practices.Unity.IUnityContainer) As Microsoft.Practices.Unity.InterceptionExtension.ICallHandler
            Console.WriteLine("Create Handler")
            Return New SampleCallHandler
    End Function
    End Class

    Public Class SampleCallHandler
    Implements ICallHandler
    Public Sub New()
            Console.WriteLine("Constructor of Sample Call handler")
    End Sub

    Public Function Invoke(input As IMethodInvocation, getNext As GetNextHandlerDelegate) As IMethodReturn Implements ICallHandler.Invoke
            Console.WriteLine("Invoke  of Sample Call handler - " & input.MethodBase.Name)
            Return getNext.Invoke(input, getNext)
    End Function
    Public Property Order As Integer Implements ICallHandler.Order
End Class

Интерфейс и реализация

Public Interface IMainInterface
    Sub DoSomething()
    <NormalSample()>
    Sub DoSomethingElse()
End Interface

Public Class MainClass
    Implements IMainInterface

    Public Sub New()
            Console.WriteLine("main class - Constructor")
    End Sub

    Public Sub DoSomething() Implements IMainInterface.DoSomething
            Console.WriteLine("main class do something...")
    End Sub

    Public Sub DoSomethingElse() Implements IMainInterface.DoSomethingElse
            Console.WriteLine("main class do something else...")
    End Sub
End Class

Основной модуль для регистрации и выполнения метода

Module Module1
    Public container As IUnityContainer
    Sub Main()
            container = New UnityContainer
            DoRegistrations()
            Console.WriteLine("Before lazy  Resolve")
            Dim lmc As Lazy(Of IMainInterface) = container.Resolve(Of Lazy(Of IMainInterface))()
            Console.WriteLine("Before making lazy function call")
            lmc.Value.DoSomething()
            Console.ReadLine()
    End Sub

    Sub DoRegistrations()
            container.AddNewExtension(Of InterceptionExtension.Interception)()
            container.RegisterType(Of IMainInterface, MainClass)()
            container.Configure(Of Interception).SetDefaultInterceptorFor(Of IMainInterface)(New InterfaceInterceptor)
    End Sub
End Module

Он производит следующий вывод:

Перед ленивым разрешением
Перед ленивым вызовом функции
основной класс - конструктор
Конструктор нормального образца атрибута
Создать обработчик
Конструктор Sample Call обработчик
Основной класс сделать что-нибудь...

Несмотря на то, что DoSomethingElse () никогда не вызывается, затраты на создание обработчика добавляются ко всем потокам. Есть ли способ избежать этого? Любая помощь приветствуется.

Заранее спасибо! С.В.

0 ответов

Другие вопросы по тегам