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

时间:2012-08-11 03:38:48

标签: c# .net aop

我有一个(也是唯一一个)我想要使用方面的方法。它是IModule.Initialize。 (该方法在我的解决方案中大约有15个类中找到)

看起来像这样:

[LogToSplashScreen]
public void Initialize()
{
   RegisterViews();
   RegisterDesignTimeVMs();
}

我希望我的方面在方法体执行之前运行它:

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

之后:

splashScreenService.ModuleLoadEnd(moduleInformation);

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

它装载了DemoWare(即额外的安装程序)。我个人不介意。但我不希望我的团队必须处理安装程序,这样才能解决我的小问题。

除了演示之外,有一个UI的事实(我猜)会让我的构建服务器变得困难。 (我使用Package Restore。)

如果我要去的话,这些都是我愿意处理的事情#34;所有这些都是"面向方面编程。
但我只需要一个......


有没有办法让自己滚动?#34;出了很多头疼?

1 个答案:

答案 0 :(得分:1)

我不会那么快就注销PostSharp。您可以将问题/问题发布到SharpCrafters forum。你现在的问题很小,但是如果你遇到AOP很有用的其他问题,即使数量很少,像PostSharp,Castle DynamicProxy等工具也是必需的。

就“滚动你自己”而言,你能做的就是使用装饰模式。我不确定moduleInformation变量来自何处,我假设您实际上打算键入moduleInfo

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

public interface IModule
{
    void Initialize();
}

你有~15个实现IModule的类。您想添加一些涉及ModuleInformation的功能,因此请创建一个装饰器类。

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个类中的一个时,只需通过装饰器运行它,如:

IModule obj = new ModuleDecorator(new OneOfMy15Classes());

当然,使用IoC容器会更好(例如StructureMap,Ninject,无论你使用什么)。

这种装饰模式的使用几乎就是PostSharp和其他AOP工具在幕后所做的事情。如果你真的只需要在一个接口上为一个方法提供一个装饰器,我认为这是要走的路:不需要引入AOP工具了。但是如果你开始创建装饰器,它们基本上做同样的事情,但是对于不同的接口,那可能会很快失控,那就是我带入AOP工具的时候。

编辑:我刚注意到“ClassNameHere”,您可以通过_subject.GetType().Name

反映来获得
相关问题