我的域层中有一些非常昂贵的业务逻辑,必须在其中跟踪数据,以便了解发生故障时发生的情况。因此,我想声明一个简单的日志记录接口:
public interface ILogger {
void Log(LogEntry entry);
}
Run Code Online (Sandbox Code Playgroud)
现在我的问题是 - 这个接口属于哪里?当然,日志记录可能是一个基础设施问题(还有一点跨层问题),但是如果我将它放在基础设施层,我的域服务就无法访问它。如果放到领域层,就引入了登录自己领域的概念,感觉很别扭。
我已经在我的应用程序中使用了 CQRS 和 EventSourcing 中的某些概念,但是为域服务中的数据发生的所有事情抛出一个事件似乎有点矫枉过正(尤其是如果数据处于无法返回的状态时)通过域服务,直到进行了进一步的转换。)
有没有办法对物业选择转换Expression<Func<T, TProperty>>到Expression<Func<object, object>>,反之亦然?我已经知道如何转换为Expression<Func<T, object>>使用...
Expression<Func<T, TProperty>> oldExp;
Expression.Lambda<Func<T, object>>(Expression.Convert(oldExp.Body, typeof(object)), oldExp.Parameters);
Run Code Online (Sandbox Code Playgroud)
...但我需要有效地转换函数的参数和结果,而不仅仅是例如将它们替换为a,ExpressionVisitor因为它们需要稍后再次转换.
我需要将特定类型的实例(将在此刻创建)传递给方法.这种类型提供了我想订阅的几个事件,所以我的代码如下所示:
var instance = new Instance();
instance.OnEvent1 += (sender, args) => {
DoThis();
DoThat();
}
instance.OnEvent2 += (sender, args) => DoThisToo();
instance.OnEvent3...
MyMethod(instance);
Run Code Online (Sandbox Code Playgroud)
现在,是否可以在初始化期间添加处理程序?所以我可以这样写:
MyMethod((MyType)instance => {
instance.OnEvent1 += (sender, args) => {
DoThis();
DoThat();
}
instance.OnEvent2...
});
Run Code Online (Sandbox Code Playgroud)
当然,由于美容原因,这仅是期望的.我喜欢我的代码小而且可读.
是否有可能创建一个具有2个输出值的函数?
我需要一种从对象中获取2个属性的方法,最好是通过表达式,因为易于使用.使用它和查询提供程序来选择多个字段.
protected Expression<Func<T, TProperty1, TProperty2>> Select2Properties { get; set; }
public MyClass(Expression<Func<T, TProperty1, TProperty2>> selector) {
Select2Properties = selector;
}
// desired usage (pseudo)
x => (x.Property1, x.Property);
Run Code Online (Sandbox Code Playgroud)
我知道这是完全垃圾,但任何其他解决方案(例如需要2个表达式属性选择器或需要元组)会导致有时不可读的构造函数调用,尤其是当我需要2个以上的属性时:
x => x.Property1, x => x.Property2, x => x.Property3, x => x.Property4
// or
x => Tuple.Create(x.Property1, x.Property2, x.Property3, x.Property4)
Run Code Online (Sandbox Code Playgroud)
有没有办法实现我想要的?
有没有办法删除WPF按钮的"内边框"?我注意到,当包含文本的按钮变得太小时,文本会被重叠,直到它不再可见,即使在技术上有足够的空间来显示它.
我已经玩过填充和内容对齐,但没有运气.


我正在尝试根据当前状态的数据设置我的角度应用程序的页面标题(在ui-router中配置).
<title ng-bind="$state.current.data.pageTitle></title>
Run Code Online (Sandbox Code Playgroud)
在这个链接上,我发现以下内容将$ state/$ stateParams的引用添加到根作用域:
.run([ '$rootScope', '$state', '$stateParams',
function ($rootScope, $state, $stateParams) {
$rootScope.$state = $state;
$rootScope.$stateParams = $stateParams;
}])
Run Code Online (Sandbox Code Playgroud)
我怎样才能将其翻译成打字稿?
function run($rootScope: ng.IRootScopeService, $state : ng.ui.IState, $stateParams : ng.ui.IStateParamsService) {
$rootScope.$state // 'state' cannot be resolved
}
Run Code Online (Sandbox Code Playgroud) 今天,我需要设计一个实体,它拥有对它的聚合根的引用.为了确保实体的实例引用与其包含的聚合根相同的聚合根,我做了一些限制,只有聚合根才能创建实体.
public class Aggregate {
public int Id { get; }
public IEnumerable<Entities> Entities { get; }
public Entity CreateEntity(params);
}
public class Entity {
public int Id { get; }
public Aggregate Parent { get; }
}
Run Code Online (Sandbox Code Playgroud)
突然间,一个关于聚合的一个非常重要的概念击中了我:聚合物并没有神奇地出现在任何地方.没有'new Aggregate(id);' 在DDD世界.
所以,现在我问......谁负责创建它们?我知道有工厂等,但考虑到聚合的身份可能是数据库生成的替代品,存储库是否负责聚合创建是不是合理?
public class MyAggregate {
public int Id { get; private set; }
protected MyAggregate() {}
public MyAggregate(int id) {
Id = id;
}
}
public interface IMyAggregateRepository {
MyAggregate Create();
void DeleteById(int id);
void Update(MyAggregate aggregate);
MyAggregate GetById(int …Run Code Online (Sandbox Code Playgroud) c# design-patterns domain-driven-design entity-framework ddd-repositories
c# ×6
expression ×3
lambda ×3
.net ×1
angularjs ×1
casting ×1
events ×1
func ×1
javascript ×1
logging ×1
properties ×1
syntax ×1
typescript ×1
wpf ×1
xaml ×1