什么是一个很好的例子cross-cutting concern?维基百科页面上的医疗记录示例对我来说似乎不完整.
特别是从这个例子中,为什么日志记录会导致代码重复(散射)?(除了简单的呼叫,如log("....")无处不在,这似乎不是什么大不了的事).
a core concern和a有cross-cutting concern什么区别?
我的最终目标是更好地了解AOP.
(我最初在这篇评论中提出了这个问题,但Mark Seemann要我改为创建一个新问题.)
我正在开始一个新的应用程序(.NET Core,如果这很重要),现在我正在尝试决定如何进行日志记录.
普遍的共识似乎是日志记录是一个跨领域的问题,因此记录器不应该直接注入应该记录的类.
通常,有一个像下面这样的例子如何不这样做:
public class BadExample : IExample
{
private readonly ILogger logger;
public BadExample(ILogger logger)
{
this.logger = logger;
}
public void DoStuff()
{
try
{
// do the important stuff here
}
catch (Exception e)
{
this.logger.Error(e.ToString());
}
}
}
Run Code Online (Sandbox Code Playgroud)
相反,具有业务逻辑的类不应该知道记录器(SRP),并且应该有一个单独的类来执行日志记录:
public class BetterExample : IExample
{
public void DoStuff()
{
// do the important stuff here
}
}
public class LoggingBetterExample : IExample
{
private readonly IExample betterExample; …Run Code Online (Sandbox Code Playgroud) c# logging dependency-injection inversion-of-control cross-cutting-concerns
在大多数任意应用中,需要在所有可用层中解决许多交叉问题,例如日志记录,消息总线,配置.我注意到的是,在某些类中,如果使用IoC注入模块,它们往往会完全炸毁构造函数.
public class MyService : IService
{
public MyService(ILogger logger, IAppSettings settings, IEventBus eventBus...)
{
}
}
Run Code Online (Sandbox Code Playgroud)
对于构造函数过度注入的常见情况,我倾向于将关注点折射成紧密组合在一起的构建块,因此我在类中获得的依赖项更少.但是,对于交叉切割概念,这是不可能的.
在日志框架中,静态工厂/服务似乎非常流行,例如
// Application root
MyLoggerService.SetFactory(log4NetFactory);
// Somewhere
MyLoggerService.GetLogger("name") // returns Log4NetLogger created by Log4NetFactory.
Run Code Online (Sandbox Code Playgroud)
我的问题是:对于各种交叉切割的东西,这种方法是否很好?如果代码最终看起来像这样,有什么缺点:
public class MyService : IService
{
private readonly IReallyNeedThat _dependency;
public MyService(IReallyNeedThat dependency)
{
_dependency = dependency;
}
private readonly ILogger _logger = LoggerService.GetLogger("MyService");
private readonly IEventBus _eventBus = EventBusService.GetEventBus();
private readonly IConfiguration _configuration = ConfigurationService.GetConfiguration(Level.Roaming)
private readonly IExceptionHandler _exceptionHandler = ExceptionPolicy.GetHandler();
private readonly ITracer _tracer = …Run Code Online (Sandbox Code Playgroud) c# design-patterns factory dependency-injection cross-cutting-concerns
我们正在寻找一种用于groovy脚本的包含机制,以便为横切关注提供空间.
在我的示例中,我们将Web服务端点作为groovy脚本,并希望登录到我们的Web服务协议.为此,我们使用隐式对象(从我们的框架中获取)来创建日志语句.
但是,如果我们在每个Web服务端点中对此进行编码,那么这是样板代码.
我们正在搜索php中的include(),包括其他groovy脚本,有什么想法如何做到这一点?
我对我正在为自定义框架开发的事件系统有所了解.
想象一下像这样的伪函数.
class Test
{
public function hi()
{
Event::add(__FUNCTION__ . 'is about to run.');
return "hi";
}
}
Run Code Online (Sandbox Code Playgroud)
想象一下,你需要为更多功能做同样的事情.(也许您想记录在运行时运行的函数,并希望将它们记录在单独的文件中.)
而不是这样做并手动将事件添加到函数中,我们可以做这样的事情吗?
class Test
{
public function hi()
{
return "hi";
}
}
// events.php (It's a pseudo code so may not work.)
// Imagine extend's purpose is to inject codes into target function
Event::bind('on', $className, $methodName, function() use ($className, $methodName)
{
return $className->$methodName->extend('before', Event::add(__FUNCTION__ . 'is about to run.'));
});
Run Code Online (Sandbox Code Playgroud)
我们的想法是注入hi()内部的函数Test class并注入我们通过extend外部传递的任何函数.'before'意味着注射必须在目标函数的第一线. …
我正在网上阅读关于横切问题,因为我刚刚将Log4j实现到我的代码中.有些人说使用AspectJ是可以的,而其他人则指出它打破了函数式编程.这些混合物是Scala针对交叉问题的解决方案.
但是,当我想我将一个特征扩展到一个与自身无关的对象/类时,我感到畏缩.
例如 new Database with Logger
这里Logger没有任何关系Database,但它如何混合提供日志记录.我更喜欢Scala方式,所以我想知道这是mixins的意思.
有人可以告诉我一个如何在Scala中进行此操作的快速示例吗?
我们最近有几个问题出现在Dynamics CRM 2011中,一个插件执行(即Execute()方法的传递)保证保持在同一个线程上.
我想使用Ambient Context模式实现跟踪,以避免将跟踪服务传递给任何可能要跟踪的类.问题在于,正如我们所知,插件仅在每个注册步骤中实例化一次,然后从同一实例提供所有后续操作; 这意味着我不能只有一些静态属性,比如Tracing.Current我分配当前ITracingService实例,我很高兴.如果我这样做,最后启动的操作将覆盖可能仍在运行的所有其他操作的实例(并且这种并发并不罕见).
现在,如果我可以确定该Execute()方法下的所有内容都保留在同一个线程中,我仍然可以使用环境上下文利用[ThreadStatic]静态字段的属性:
public static class Tracing
{
[ThreadStatic]
private static ITracingService _current;
public static ITracingService Current
{
get
{
if (null == _current)
{
_current = new NullTracingService();
}
return _current;
}
set { _current = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
我会在输入Execute()方法时设置它并在最后清除它,以便删除对跟踪服务实例的引用.
我唯一可以在MSCRM插件的上下文中找到线程的方法是,显然单个线程来自ThreadPool - 无论对我的问题可能产生什么后果.
有没有人更深入地了解如何使用MSCRM插件处理线程 - 或者在这种特殊情况下如何使用SOLID代码优雅地处理跟踪问题的任何其他想法(AOP /动态拦截在这里没有选项)?
感谢您的帮助和指点.
c# multithreading cross-cutting-concerns threadpool dynamics-crm-2011
假设我有一个复杂的系统,那里有大量的树木.简单的想法是员工/经理关系,许多员工向一位经理报告.现在除了经理之外,还有能够代表经理行事的支持人员可以操纵经理的员工.
在CQRS系统中,您如何为"编辑员工"的假设操作建模消息,其中操作的调用者是支持人员.只有当经理安全关系中的工作人员对其领域的员工采取行动时,该行动才能成功.
验证此安全性将涉及查询数据库以验证被修改的人确实在该经理的员工链内.
这个查询会在哪里发生?在发起"编辑员工"消息之前?
如果在发起消息之前对数据进行了前期验证,则在最终一致的系统中,假设在处理"编辑员工"消息之前,已发生单独的操作,该操作将删除用户完成"编辑员工"操作的权限.如果命令处理程序未验证该消息的安全性问题,则即使用户不再具有执行该消息的权限,该消息仍将成功.
这似乎意味着双边验证,类似于UI验证和服务器端验证将是最佳的行动方案.然而,完成该验证的方法似乎违反了CQRS的关键原则.
在使用CQRS时,必须处理这些和其他类似的横切问题时,哪种方法最好?
我有一个 MVC 分层应用程序,我对横切层有一些疑问。到目前为止,这一层有日志记录、DI、错误处理和缓存。
我创建了一个项目并将所有这些功能按文件夹分开。这个可以吗?还是应该为每个功能创建一个项目?
因为我在这个项目中设置了 Autofac(DI 文件夹),所以我必须添加对其他项目的引用:模型、存储库和服务。可以将这些引用添加到 Cross Cutting 项目吗?
我应该创建一个单独的项目来对通用功能进行分组吗?例如枚举、常量和 GetMd5Hash 等方法。或者我应该为此使用交叉切割项目?
我应该将 Automapper 视为跨领域关注点吗?到目前为止,我在Presentation 层设置了它,从Entity 转换为ViewModel,将ViewModel 转换为Entity。因此,我不得不添加对 Model 的引用,这是我想避免的。
c# architecture model-view-controller cross-cutting-concerns automapper
谁能用例子解释一下 Spring AOP 中的方面、关注点和横切关注点之间的区别?我浏览了很多教程网站,但没有得到任何好的解释。
aop ×4
c# ×4
architecture ×1
aspect ×1
automapper ×1
cqrs ×1
domain-model ×1
endpoint ×1
factory ×1
groovy ×1
include ×1
logging ×1
messaging ×1
php ×1
scala ×1
scala-2.10 ×1
security ×1
threadpool ×1
web-services ×1