我有一个(也是唯一一个)我想要使用方面的方法。它是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;出了很多头疼?
答案 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