A.净定义属性进行模拟?
-
18-09-2019 - |
题
我有一些方法,需要运行为的某些服务的帐户,所以我做正常事情:
public DoSomeWorkAsServiceAccount() {
...
// assume I am given tokenHandle
WindowsIdentity newId = new WindowsIdentity(tokenHandle);
WindowsImpersonationContext impersonatedUser = newId.Impersonate();
...
// do the work here
...
impersonatedUser.Undo();
}
我想避免编写这些代码中的每一个方法,因此我认为创造一个定义属性:
[Impersonate(tokenHandle)]
public DoSomeWorkAsServiceAccount() {
// do the work
}
这是我的问题:
- 这可能吗?
- 你能告诉我东西,这将避免重复代码?
在此先感谢。
解决方案
我不认为一个属性是最好的方式来实现一个功能,这样。大部分属性只是作为元数据的类型和成员(面向方面的东西搁置).你会需要写什么检查的这一特性,并重新路线的方法调整。如果你已经有一些AOP的代码,在地方,这不应该是一个苦差事,但是如果你没有,你很可能是更好的服务通过这样的事情:
public void DoWorkAsUser(tokenHandle, Action op)
{
WindowsIdentity newId = new WindowsIdentity(tokenHandle);
WindowsImpersonationContext impersonatedUser = newId.Impersonate();
op();
impersonatedUser.Undo();
}
然后叫它是这样的:
DoWorAsUser(token, MyMethod);
这可以让你集中模拟码不必要的混乱与周围的反思,codeweaving,等等。
其他提示
我已经没有任何代码,但是你可以尝试使用 PostSharp 要做到这一点。你可以创建一个OnMethodInvocationAspect其中安排安全的东西之前呼吁的方法码。例如:
public class ImpersonateAttribute : OnMethodInvocationAspect
{
public override void OnInvocation(MethodInvocationEventArgs eventArgs)
{
WindowsIdentity newId = new WindowsIdentity(tokenHandle);
WindowsImpersonationContext impersonatedUser = newId.Impersonate();
eventArgs.Proceed() // Call the code in the actual method.
impersonatedUser.Undo();
}
}
上述是一个完整的猜测,但通过建议的,我可以给你一个有效的选择。
不隶属于 StackOverflow