Ant*_*mon 1 c# wcf dependency-injection castle-windsor castle-dynamicproxy
我正在学习Castle Windsor和WCF的依赖注入和拦截,我想检查一个截获的方法是否有自定义属性(LogAttribute).
(我的例子基于这个答案:https://stackoverflow.com/a/2593091)
服务合约 :
[ServiceContract]
public interface IOrderService
{
[OperationContract]
Order GetOrder(int orderId);
}
[DataContract]
public class Order
{
[DataMember]
public string Id { get; set; }
// [...]
}
Run Code Online (Sandbox Code Playgroud)
服务实施:
public class OrderService : IOrderService
{
private readonly IDatabase _database;
public OrderService(IDatabase database)
{
_database = database;
}
[Log] // <- my custom attribute
public Order GetOrder(int orderId)
{
return _database.GetOrder(orderId);
}
}
public class LogAttribute : Attribute
{ }
Run Code Online (Sandbox Code Playgroud)
简单的数据访问层:
public interface IDatabase
{
Order GetOrder(int orderId);
}
public class Database : IDatabase
{
public Order GetOrder(int orderId)
{
return new Order
{
Id = orderId
};
}
}
Run Code Online (Sandbox Code Playgroud)
依赖注入和拦截:
public class Global : HttpApplication
{
public static WindsorContainer Container { get; private set; }
protected void Application_Start(object sender, EventArgs e)
{
BuildContainer();
}
private static void BuildContainer()
{
if (Container != null)
return;
Container = new WindsorContainer();
Container.AddFacility<WcfFacility>();
Container.Register(Component.For<IInterceptor>().ImplementedBy<MyInterceptor>().LifestyleTransient());
Container.Register(Component.For<IDatabase>().ImplementedBy<Database>().LifestylePerWcfOperation());
Container.Register(Component.For<IStringReverser>().ImplementedBy<StringReverser>().Interceptors<MyInterceptor>());
}
}
public class MyInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
DoSomeWorkBefore(invocation);
invocation.Proceed();
}
private static void DoSomeWorkBefore(IInvocation invocation)
{
if (Attribute.IsDefined(invocation.Method, typeof(LogAttribute)))
{
// This part of the code is never executed
Debug.WriteLine("Method has Log attribute !");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过invocation.Method.GetCustomAttributes和Attribute.GetCustomAttribute,但它并没有找到LogAttribute.有任何想法吗 ?
(Windsor)服务用于IOrderService接口,因此invocation.Method将指向接口上的方法,该方法没有该属性.
使用invocation.MethodInvocationTarget来获取类的方法
| 归档时间: |
|
| 查看次数: |
1376 次 |
| 最近记录: |