考虑这种情况.我有一些业务逻辑,现在需要写入日志.
interface ILogger
{
void Log(string stuff);
}
interface IDependency
{
string GetInfo();
}
class MyBusinessObject
{
private IDependency _dependency;
public MyBusinessObject(IDependency dependency)
{
_dependency = dependency;
}
public string DoSomething(string input)
{
// Process input
var info = _dependency.GetInfo();
var intermediateResult = PerformInterestingStuff(input, info);
if (intermediateResult== "SomethingWeNeedToLog")
{
// How do I get to the ILogger-interface?
}
var result = PerformSomethingElse(intermediateResult);
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
你会如何获得ILogger界面?我看到两种主要的可能性;
你更喜欢哪种方法,为什么?还是有更好的模式?
更新: 请注意,我不需要记录所有方法调用.我只想记录在我的方法中可能发生或可能不发生的一些(罕见)事件.
我有一个包含"标签"列表的文档类.就像是:
class Item {
string Name { get; set; }
List<string> Tags {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
现在我想为RavenDB创建一个查询,它将所有按标签列表过滤的项目交给我.使用实体框架时,我设法通过以下方式执行此操作:
var query = GetQueryable();
foreach (var tag in tags)
{
query = query.Where(i => i.Tags.Contains(tag));
}
Run Code Online (Sandbox Code Playgroud)
但是,这似乎不适用于RavenDB,很可能是因为不支持Contains ..我也尝试使用Any,(Where(i => i.Tags.Any(t=>t == tag))
)重写它但是这给了我一个奇怪的例外:
Unable to cast object of type
'System.Linq.Expressions.PrimitiveParameterExpression`1[System.String]'
to type 'System.Linq.Expressions.MemberExpression
Run Code Online (Sandbox Code Playgroud)
有什么好主意吗?我这样做完全错了吗?
一个相当简单的问题.我正在开发一个项目,我需要从一种上下文存储中动态存储和检索属性值.这些值将立即写入并多次读取.检索速度是这里的首要任务,每纳秒都很重要.
通常,我只是用一个字典来实现它,但是使用C#4和ExpandoObject,我想也许有更好的方法?有没有人有这方面的经验?我在其他帖子中看到它没有使用字典实现,这使我对它是更快还是更慢感到好奇?
让我试着澄清一些伪代码:
// In the main loop
var context = new Context();
context["MyKey"] = 123;
context["MyOtherKey"] = "CODE";
context["MyList"] = new List<int>() { 1, 12, 14 };
foreach(var handler in handlers) {
handler.DoStuff(context);
}
Run Code Online (Sandbox Code Playgroud)
-
// "Handlers"
class MyFirstHandler {
void DoStuff(Context context) {
if (context["MyKey"] > 100)
context["NewKey"] = "CODE2";
}
}
class MySecondHandler {
void DoStuff(Context context) {
if (context["MyOtherKey"] == "CODE")
context["MyList"].Add(25); // Remember, it's only Pseudo-code..
}
}
Run Code Online (Sandbox Code Playgroud)
好吧,希望你能得到我想要的东西..
我也完全接受其他建议.我一直在想要使Context类静态类型化(即实际上有一个MyKey
属性,MyOtherKey
属性等),虽然它可能会对我们产生很大的影响.