小编Cod*_*nia的帖子

使用哪种模式进行日志记录?依赖注入或服务定位器?

考虑这种情况.我有一些业务逻辑,现在需要写入日志.

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界面?我看到两种主要的可能性;

  1. 在构造函数上使用依赖注入传递它.
  2. 通过单一服务定位器获取它.

你更喜欢哪种方法,为什么?还是有更好的模式?

更新: 请注意,我不需要记录所有方法调用.我只想记录在我的方法中可能发生或可能不发生的一些(罕见)事件.

c# design-patterns dependency-injection service-locator

34
推荐指数
4
解决办法
2万
查看次数

用于RavenDB的多个Contains/Any的Linq查询

我有一个包含"标签"列表的文档类.就像是:

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# linq ravendb

17
推荐指数
1
解决办法
7531
查看次数

从性能的角度来看ExpandoObject与Dictionary的关系?

一个相当简单的问题.我正在开发一个项目,我需要从一种上下文存储中动态存储和检索属性值.这些值将立即写入并多次读取.检索速度是这里的首要任务,每纳秒都很重要.

通常,我只是用一个字典来实现它,但是使用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属性等),虽然它可能会对我们产生很大的影响.

c# dictionary expandoobject

9
推荐指数
1
解决办法
7469
查看次数