5

我正在关注Unity Interception链接,以便在我的项目中实施 Unity。

通过一个链接,我创建了一个类,如下所示:

[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);
}

这是我被卡住的主要事情,我不知道我必须如何在GetModelByID()方法上使用 Intercept 类以及如何获得统一。

请帮帮我,也请解释一下Unity拦截的概念。

4

1 回答 1

0

unity拦截解释

拦截是一个概念,您可以在其中将“核心”代码与其他问题隔离开来。在你的方法中:

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

您不想用其他代码(如日志记录、分析、缓存等)“污染”它,这不是方法核心概念的一部分,统一拦截将帮助您解决这个问题。

通过拦截,您可以向现有代码添加功能,而无需接触实际代码!

你的具体问题

如果我的 _business 为空,则不应调用 GetModelById(),我该如何实现?

您实际上可以通过使用拦截和反射来实现您想要做的事情。我现在无法访问开发环境,但是这样的东西应该可以工作,

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;
}

您可以访问方法(您要拦截的方法)所属的目标(对象),然后通过反射读取该对象私有字段的值。

于 2014-01-31T07:47:32.490 回答