2014-01-27 5 views
5

Я слежу за ссылкой Unity Interception, чтобы реализовать Unity в моем проекте.Единство Концепция перехвата Ясность

By, перейдя по ссылке, я сделал класс, как показано ниже:

[AttributeUsage(AttributeTargets.Method)] 
public class MyInterceptionAttribute : Attribute 
{ 

} 

public class MyLoggingCallHandler : ICallHandler 
{ 
    IMethodReturn ICallHandler.Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) 
    { 
     IMethodReturn result = getNext()(input, getNext); 
     return result; 
    } 
    int ICallHandler.Order { get; set; } 
} 

public class AssemblyQualifiedTypeNameConverter : ConfigurationConverterBase 
{ 
    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) 
    { 
     if (value != null) 
     { 
      Type typeValue = value as Type; 
      if (typeValue == null) 
      { 
       throw new ArgumentException("Cannot convert type", typeof(Type).Name); 
      } 
      if (typeValue != null) return (typeValue).AssemblyQualifiedName; 
     } 
     return null; 
    } 

    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) 
    { 
     string stringValue = (string)value; 
     if (!string.IsNullOrEmpty(stringValue)) 
     { 
      Type result = Type.GetType(stringValue, false); 
      if (result == null) 
      { 
       throw new ArgumentException("Invalid type", "value"); 
      } 
      return result; 
     } 
     return null; 
    } 
} 

До сих пор я сделал ничего особенного, просто следовал примеру, как описано в верхней ссылке. Но, когда мне нужно реализовать класс Unity Interception, я столкнулся с большим путаницей.

Предположим, я должен реализовать на одном из методов в моем классе, как:

[MyInterception] 
public Model GetModelByID(Int32 ModelID) 
{ 
    return _business.GetModelByID(ModelID); 
} 

Это главное, где я застрял, я ДНТ знаю, как я должен использовать класс Intercept над метод GetModelByID() и как получить единство.

Пожалуйста, помогите мне, пожалуйста, также объясните концепцию Unity Interception.

+0

Что вы хотите перехватить или какую функциональность вы хотите добавить. В основном ваша реализация 'ICallHandler' ничего не делает. Он вызывает ваш метод GetModelById и возвращает значение. – Jehof

+0

@Jehof Я просто хочу, чтобы, если мой ** _ бизнес ** имеет значение null, тогда не следует делать вызов ** GetModelById() **, как я могу это достичь? –

+0

Выбросить исключение в методе 'GetModelById', если' _business' равно null. Перехват не является правильным инструментом для поддержки этого. – Jehof

ответ

0

Unity перехват объяснил

Перехвата является концепцией, где вы можете изолировать «основной» код от других проблем. В вашем методе:

public Model GetModelByID(Int32 ModelID) 
{ 
    return _business.GetModelByID(ModelID); 
} 

Вы не хотите «загрязнять» его с другим кодом, как лесозаготовки, профилирование, кэширование и т.д., что не является частью основной концепции метода и единства перехвата поможет вам с этим.

С перехватом вы можете добавить функциональность в существующий код, не касаясь фактического кода!

Ваша конкретная проблема

если мой _Бизнес равно нулю, то нет вызова GetModelById() должно быть сделано, как я могу добиться этого?

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

IMethodReturn ICallHandler.Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext) 
{ 
    IMethodReturn result = input.CreateMethodReturn(null, new object[0]); 

    var fieldInfos = input.Target.GetType().GetFields(BindingFlags.Instance | BindingFlags.NonPublic); 
    var businessField = fieldInfos.FirstOrDefault(f => f.Name == "_business"); 

    if (businessField != null && businessField.GetValue(input.Target) != null) 
     result = getNext()(input, getNext); 

    return result; 
} 

Вы можете получить доступ к цели (объекта), что метод (один вы перехватывать) принадлежит, а затем прочитать значение этого объекта закрывает частные поля посредством отражения.

+0

спасибо jonnep за помощь – HarshSharma

+0

В принципе, если я должен определить «Unity Interception», как я могу определить, я проверил на google, но не нашел конкретного и ограниченного ответа, пожалуйста, объясните. – HarshSharma

+0

Вы ищете определение/резюме того, что такое перехват единства? Не уверен, что я понимаю ваш вопрос – jonnep

Смежные вопросы