我可以指定SkipPostSharp常量以确保项目从PS流程列表中排除.我想以相反的方式做到这一点.我希望PS假设它不应该处理任何我没有具体告诉它的东西.
这可以实现吗?
我将编写一个验证组件,以便在不同的项目中使用它.我并不熟悉任何验证框架,如Enterprise Library VAB,Fluent,CuttingEdge.Conditions等等,但是我没有时间与所有这些框架一起工作,看看哪个更适合我的目的.
我希望这个组件为我提供两种不同的功能:
首先,我想要一些验证器,如EmailValidator,StringLengthValidator,MyCustomValidator等,我可以随时在代码中使用它们,如下所示:
public class EmailValidator : RegexValidator // or StringValidator or whatever!
{
public EmailValidator() : base("emailRegexHere")
{
}
public bool override DoValidate(string value)
{
return base.DoValidate(value);
}
}
...
public void MyMethod(string email)
{
EmailValidator validator = new EmailValidator();
if(!validator.Validate(email))
throw new NotValidatedException("email is invalid.");
...
}
Run Code Online (Sandbox Code Playgroud)
其次,我需要通过将DataAnnotations之类的东西应用到我想要的任何方法参数来验证参数,而无需任何额外的编码.我知道的一种可能的方法是使用PostSharp编写Aspects 以在方法启动时注入代码(OnMethodEntry).我用Postsharp完成了Logging,它运行得很好.
此外,Microsoft引入了IParameterInspector来在WCF中执行输入验证,它提供了两种方法BeforCall和AfterCall,但我认为它只适用于WCF.
总结一下,我需要在我的WCF或WebService中进行验证,如下所示:
[System.Web.Script.Services.ScriptService]
public class MyServiceClass : System.Web.Services.WebService
{
[Aspects.Validate]
[WebMethod(EnableSession = true)]
public string SubmitComment([Validation.Required]string …Run Code Online (Sandbox Code Playgroud) 我一直试图弄清楚它是如何在低级别上运行的:
[Authorize]
public ActionResult Index()
{
return View();
}
Run Code Online (Sandbox Code Playgroud)
基本上,上面的代码片段似乎拦截了对Index方法的调用,执行授权检查,以及如果未经授权则抛出和异常.该异常可防止调用Index方法中的代码.
这看起来很像AOP,并不是C#中容易做到的.如果我要实现我自己的扩展System.Attribute的类,我就没有任何接口可以挂接到我的属性修饰的方法的前或后调用.那么MVC Authorize属性如何做到这一点,我怎么能自己做呢?
PostSharp是一个使用IL Weaving完成同样事情的库.基本上,在编译时,PostSharp会扫描程序集以查找使用某些属性修饰的方法,然后重新编写代码以使用其他方法调用包装方法调用.
MVC框架是否也在编译时执行某种IL编织?我有可能进行自己的IL编织吗?或者是否有其他技术可以应用相同的AOP原则而无需复杂的IL编织?
我试图找到关于IL Weaving的信息,但我找到的只是关于PostSharp的文章.由于许可麻烦,我宁愿远离PostSharp,而且,我只是想知道他们为我自己作为开发人员的成长做了多少.这真是令人着迷.
是否可以CompileTimeInitialize在PostSharp 3.1中使用反射?
以下代码在3.0中工作:
public class TestClass
{
public string TestField;
[TestAspect]
public void TestMethod() { }
}
public class TestAspect : OnMethodBoundaryAspect
{
private LocationInfo locationInfo;
public override void CompileTimeInitialize(MethodBase method, AspectInfo aspectInfo)
{
this.locationInfo = new LocationInfo(method.ReflectedType.GetField("TestField"));
}
public override void OnSuccess(MethodExecutionArgs args)
{
Console.WriteLine(this.locationInfo);
}
}
Run Code Online (Sandbox Code Playgroud)
随着3.1升级,this.locationInfo成为Missing Property并访问其任何属性的原因NullReferenceException.
我这样做是错误的还是在3.1升级中改变了?如果是这样,你能否建议我采取正确的方法来解决这个问题?
PS:如果我设置this.locationInfo的RuntimeInitialize东西正常工作.
使用Postsharp,如何在抛出异常后设置返回值?
我认为这会奏效:
namespace MvcApplication3.Controllers
{
public class ValuesController : ApiController
{
// GET api/values/5
[MyExceptionHandler]
public string Get(int id)
{
string value = GetValue(id);
return value;
}
private string GetValue(int id)
{
throw new DivideByZeroException();
}
}
[Serializable]
public class MyExceptionHandler : OnExceptionAspect
{
public override void OnException(MethodExecutionArgs args)
{
args.FlowBehavior = FlowBehavior.Continue;
args.ReturnValue = "Error Getting Value";
}
}
}
Run Code Online (Sandbox Code Playgroud) 我需要在第三方DLL中从类中装饰所有方法.我使用C#5.0和postharp 3.1.我当然可以这样做.
//In 3rd party library
class A
{
public virtual int foo(string a) {}
public virtual void foo2() {}
}
//In my
class B : A
{
public override int foo(string a) {
int result = base.foo(a);
//Do something
return result;
}
public override void foo2() {
base.foo2();
//Do something
}
}
Run Code Online (Sandbox Code Playgroud)
做某事总是一样的.
我不想复制所有丑陋的方法.有些人想知道我可以使用什么或google?谢谢
我在VS2013中使用PostSharp Express创建验证方面,我可以将其应用于我的属性.我按照这个PostSharp指南进行了位置拦截.他们都运作良好,但我收到数百条警告说:
"MyNamespace.get_MyProperty"上的冲突方面:转换".MyValidation1Attribute:由建议OnGetValue拦截,OnSetValue"和"MyNamespace.Validation2Attribute:由建议OnGetValue拦截,OnSetValue"不可交换,但它们没有强烈排序.他们的执行顺序是不确定的.
我认为这是我在同一属性上放置多个验证方面的结果.首先,我尝试用逗号分隔属性,我理解应该对它们进行排序:[Validation1,Validation2]但警告仍然存在.
由于我的方面是可交换的(它们执行的顺序无关紧要),PostSharp文档建议使用AspectTypeDependency将其标记为如下:
[AspectTypeDependency(AspectDependencyAction.Commute, typeof(ILocationValidationAspect))]
Run Code Online (Sandbox Code Playgroud)
但是,似乎PostSharp.Aspects.Dependencies名称空间不包含在Express许可证下.是否有任何可能的解决方案仅使用Express许可证解决这些警告?或者这是否意味着我不能在不购买专业版或终极版的情况下使用多个方面?如果我能以这种方式删除这些警告,我愿意尝试实现我自己的依赖控制器.
我遇到PostSharp 4.3.21的问题,我选择安装已编译的图像,但实际上并没有安装.因此,即使我选择安装,如果我想每小时安装一次,也会收到提示.
可以肯定的是,这就是我所选择的:
这就是我编译的图像列表在PostSharp - >选项 - >编译图像中的样子:
假设我有一个被声明为给定基类的实例变量。我想找到该对象实际上是什么原始的、最上面的类型,而不是基类。我该怎么做呢?
我有一个类似于 PostSharp 的验证属性,因此反射命中是在编译时发生的,因此由于该CompileTimeValidation方法而没有实际意义。我只是不知道该怎么做。进行IsSubclassOf扫描没有帮助,因为我会得到多个误报。
为了提供上下文,我有一个基本Entity类型。我从这个类型派生出所有类型的定义Entity。我Entity使用策略属性来装饰这些类型,包括基本类型。PostSharp 方面在编译时验证某些策略约束。我希望能够仅使用Entity方面验证来装饰基类型,以便Entity验证其所有派生类型。我可以看到验证已经发生。但是,它被作为 anEntity和 not处理DerivedEntity。为了评估 的策略DerviedEntity,我需要专门装饰该类。如果可能的话我想不这样做,而只是装饰Entity。
本质上,我想将验证集中在基类上,因为所有派生类的验证架构都是相同的。但是,派生类中的值可能会更改,我需要进行一些边界检查。
编辑:让我们添加一些代码。
[EnforceMaxLifetimePolicy]
[LifetimePolicy]
public class Entity<T>
{
public string Key { get; set; }
public T Object { get; set; }
public TimeSpan EntityLifetime
{
get
{
var lifetimePolicy =
Attribute.GetCustomAttribute(GetType(), typeof(LifetimePolicyAttribute)) as LifetimePolicyAttribute;
return new TimeSpan(lifetimePolicy.Hours, lifetimePolicy.Minutes, 0);
}
}
}
[Serializable]
[AttributeUsage(AttributeTargets.Class)]
internal class LifetimePolicyAttribute : …Run Code Online (Sandbox Code Playgroud) 我在我从未遇到过问题的解决方案中构建一些 C# 项目时遇到了麻烦。构建失败并显示缺少元数据文件的错误。诊断级别的错误描述和 msbuild 日志输出显示了一些令人惊讶的进展。我遇到这个问题的项目之一叫做WpfControlLibrary. 它引用了解决方案中的以下项目:
Helpers
HunAlmex.Kioszk.Common
HunAlmex.Kioszk.Communication.ImportedServiceContracts
HunAlmex.Kioszk.Data
Run Code Online (Sandbox Code Playgroud)
解决方案文件夹是 "D:\Entegro\TFS\Volánbusz TVM\Bugfixes 2018-06".
构建失败错误如下:
Error CS0006 Metadata file 'D:\Entegro\TFS\Volánbusz TVM\Bugfixes 2018-06\HunAlmex.Kioszk.Data\bin\Debug\WpfControlLibrary.dll' could not be found (in project WpfControlLibrary; file CSC)
Run Code Online (Sandbox Code Playgroud)
因此,当我构建WpfControlLibrary项目时,CSC正在其中一个项目的bin\debug文件夹中寻找以项目命名的 dllWpfControlLibrary项目引用。
构建日志显示上述所有四个项目引用都是这种情况。WpfControlLibrary.dll在bin\debug看似正确地构建这些项目后,构建正在寻找在其文件夹中调用的 dll (这些项目是使用正确命名的 dll 和 pdb 文件构建的)。构建错误可能只包含一个丢失的 dll,因为它在第一个错误时失败。
但是,如果我构建整个解决方案,并查看项目的bin\debug文件夹Helpers,我看到项目构建正确,然后在构建过程中,Helpers.dll文件消失了,并且出现了一个名为WpfControlLibrary.dll(和pdb)的文件。构建最终失败,因为它没有找到Helpers.dll.
WpfControlLibrary项目引用的项目没有引用WpfControlLibrary。
上面的结果是由VS Enterprise 2017 version 15.8.2with产生的msbuild version …
postsharp ×10
c# ×8
validation ×3
.net ×2
aop ×2
asp.net-mvc ×1
msbuild ×1
wcf ×1
web-services ×1