2015-03-31 4 views
0

У меня есть класс A, который реализует интерфейс IA:автоматически реализует интерфейс для упаковки существующей реализации

class A : IA 
{ 
    f(){...} 
} 

Я хочу, чтобы обернуть A с помощью нового класса WrapA, который будет осуществлять IA, а также, с целью упаковка A по телефону каждый из своих функций в качестве новой задачи:

class WrapA : IA 
{ 
    private A; 
    f() 
    { 
    StartInNewTask(A.f()); 
    } 
} 

конечно, это очень легко сделать вручную.

Но я хочу автоматический механизм для этой упаковки, аналогичный тому, который используется mocks для издевательства интерфейсов.

Если это было сделано, прежде чем я хотел бы увидеть пример или любую идею о том, как его реализовать.

ответ

0

Я обнаружил, что лучшей основой были перехватчики Unity.

Поскольку я уже использовал Unity Bootstrapper, его было довольно легко интегрировать.

https://msdn.microsoft.com/en-us/library/dn178466%28v=pandp.30%29.aspx

Реализация (упрощенно, то вам нужно быть осторожным с возвращаемым значением):

public class RestPerformanceInterceptor : IInterceptionBehavior 
{ 
    public bool WillExecute { get { return true; } } 

    public IEnumerable<Type> GetRequiredInterfaces() 
    { 
     return new[] { typeof(IA) }; 
    } 

    public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) 
    { 
     var behaviorDelegate = getNext(); 

     StartInNewTask(behaviorDelegate.Invoke(input, getNext)); 

     return new Mock<IMethodReturn>(); 
    } 
} 
1

Для этого вы можете использовать CodeDOM, технологию динамического создания кода. Вы создаете пространство имен/класс объектно-ориентированным способом. Для получения подробной документации см. MSDN CodeDOM.

В вашем случае вам нужно будет прочитать методы, которые вы хотите обернуть отражением, используя метод Type.GetMethods -Method. Таким образом, вы получаете доступ к целевым методам, используя CodeMethodInvokeExpression. Вам нужно иметь ссылку на обернутый объект, с которым вы можете получить доступ, используя CodeVariableReferenceExpression. При этом вы можете использовать CodeMethodInvokeExpression для вызова метода Task.Run() -Method (или того, что вы используете) и предоставить делегата и ссылку на ваш целевой объект.

Это немного сложная тема, поэтому вам нужно будет прочитать некоторую документацию, но поскольку это технология Microsoft, она очень хорошо документирована. После того, как вы прочтете это, будет довольно легко реализовать вашу обертку.