泛型动态装饰器





0/5 (0投票)
通用动态装饰器通过使用 .NET 泛型增强了动态装饰器,使其具有强类型。
通用动态装饰器通过使用 .NET 泛型增强了 动态装饰器,使其具有强类型。
如您可能已经知道,使用 ObjectProxyFactory.CreateProxy
创建代理时,需要将其转换为特定的接口类型,以便将额外的行为附加到该接口的方法上。问题是,如果转换为错误的接口类型,代码可以通过编译,甚至可以执行,直到您使用它来调用方法。然后,它会生成运行时错误。
使用通用动态装饰器,ObjectProxyFactory.CreateProxy<T>
返回一个强类型的接口。不再需要进行动态转换。如果指定了错误的接口类型,代码可以通过编译,但在您有机会使用该接口调用方法之前,会在创建代理期间生成运行时错误。
以下代码演示了如何使用通用动态装饰器将进入日志添加到类 Employee
的对象 emp
的方法 DetailsByLevel
中。
static void Main(string[] args)
{
IEmployee emp = new Employee(1, "John", "Smith", new DateTime(1990, 4, 1), 1);
System.Int32? id = null;
System.String detail = "";
emp = ObjectProxyFactory.CreateProxy<IEmployee>(
emp,
new String[] { "DetailsByLevel" },
new Decoration((x, y) =>
{
IMethodCallMessage method = x.CallCtx;
string str = "Calling " + x.Target.GetType().ToString() +
"." + method.MethodName +
"(";
int i = 0;
foreach (object o in method.Args)
{
if (i > 0)
str = str + ", ";
str = str + o.ToString();
}
str = str + ")";
Console.WriteLine(str);
Console.Out.Flush();
}, null),
null);
id = emp.DepartmentID;
detail = emp.DetailsByLevel(2);
}
有关使用动态装饰器扩展对象功能的更多信息,请参阅文章 动态装饰器模式。
有关可用于编写对象强大方面功能的示例和特性,请参阅文章 使用动态装饰器添加方面。
有关在应用程序开发中一般使用动态装饰器的原则,请参阅文章 组件、方面和动态装饰器。
有关在 ASP.NET 应用程序中使用动态装饰器,请参阅文章 ASP.NET 应用程序的组件、方面和动态装饰器。
有关在 ASP.NET MVC 应用程序中使用动态装饰器,请参阅文章 ASP.NET MVC 应用程序的组件、方面和动态装饰器。
有关在 Silverlight/WCF 应用程序中使用动态装饰器,请参阅文章 Silverlight / WCF 服务应用程序的组件、方面和动态装饰器。
有关在 MVC/AJAX/REST 应用程序中使用动态装饰器,请参阅文章 MVC/AJAX/REST 应用程序的组件、方面和动态装饰器。