Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从头开始创建面向方面的属性/方法_C#_.net_Aop - Fatal编程技术网

C# 从头开始创建面向方面的属性/方法

C# 从头开始创建面向方面的属性/方法,c#,.net,aop,C#,.net,Aop,我有一个(而且只有一个)方法想要在其上使用方面。它是。(该方法在我的解决方案中的大约15个类中找到) 它看起来是这样的: [LogToSplashScreen] public void Initialize() { RegisterViews(); RegisterDesignTimeVMs(); } 我希望我的方面在方法体执行之前运行此功能: var moduleInfo = new ModuleInformation{ModuleName = "ClassNameHere"};

我有一个(而且只有一个)方法想要在其上使用方面。它是。(该方法在我的解决方案中的大约15个类中找到)

它看起来是这样的:

[LogToSplashScreen]
public void Initialize()
{
   RegisterViews();
   RegisterDesignTimeVMs();
}
我希望我的方面在方法体执行之前运行此功能:

var moduleInfo = new ModuleInformation{ModuleName = "ClassNameHere"};
splashScreenService.ModuleLoadStart(moduleInformation);
这之后:

splashScreenService.ModuleLoadEnd(moduleInformation);

旁注:
我看着这个,心想,好吧,是时候试试PostSharp了。我听说它是冠军的AOP工具。所以我启动了NuGet软件包(期望获得免费版本)并安装了它

它还装有DemoWare(即额外的安装程序)。我个人不介意。但我不希望我的团队为了解决我的小问题而不得不与安装人员打交道

撇开演示不谈,is有一个UI的事实(我猜)会使我的构建服务器变得很困难。(我使用包还原。)

如果我“全力以赴”进行面向方面的编程,这些都是我愿意处理的事情。
但我只需要一个



有没有一种方法可以“自己滚”出去而不让人头痛?我不会这么快就把PostSharp注销。您可能希望将您的问题/问题发布到。现在您的问题很小,但是如果您遇到AOP有用的其他问题,即使是小数量的问题,PostSharp、Castle DynamicProxy等工具可能是必要的

至于“滚动你自己的”,你可以做的是使用装饰图案。我不确定
moduleInfo
变量来自何处,我假设您实际上是想键入
moduleInfo

然后,假设您的界面看起来像:

public interface IModule
{
    void Initialize();
}
您有大约15个实现IModule的类。您想添加一些涉及模块信息的功能,所以创建一个decorator类

public class ModuleDecorator : IModule
{
    IModule _subject;
    public ModuleDecorator(IModule subject)
    {
        _subject = subject;
    }

    public void Initialize()
    {
        var moduleInfo = new ModuleInformation{ModuleName = "ClassNameHere"};
        splashScreenService.ModuleLoadStart(moduleInfo);

        _subject.Initialize();

        splashScreenService.ModuleLoadEnd(moduleInfo);
    }
}
现在,当您想实例化~15个类中的一个时,只需通过decorator运行它,如:

IModule obj = new ModuleDecorator(new OneOfMy15Classes());
当然,使用IoC容器会更好(例如StructureMap、Ninject,无论您使用什么)

这种装饰器模式的使用与PostSharp和其他AOP工具在幕后所做的差不多。如果一个接口上的一个方法确实只需要一个decorator,我认为这是一个好办法:现在还不需要引入AOP工具。但是,如果你开始创建装饰器,它们基本上做相同的事情,但用于不同的接口,那么很快就会失控,这时我会引入一个AOP工具

编辑:我刚刚注意到“ClassNameHere”,您可以通过使用
\u subject.GetType().Name