小编Run*_*une的帖子

正确使用依赖注入

我和另外两位同事正试图了解如何最好地设计一个程序.例如,我有一个接口ISoda实现这样的接口和多个类Coke,Pepsi,DrPepper,等....

我的同事说,最好将这些项目放入数据库,如键/值对.例如:

Key       |  Name
--------------------------------------
Coke      |  my.namespace.Coke, MyAssembly
Pepsi     |  my.namespace.Pepsi, MyAssembly
DrPepper  |  my.namespace.DrPepper, MyAssembly
Run Code Online (Sandbox Code Playgroud)

...然后有XML配置文件,将输入映射到正确的密钥,查询数据库中的密钥,然后创建对象.

我没有任何具体原因,但我只是觉得这是一个糟糕的设计,但我不知道该说什么或如何正确地反对它.

我的第二位同事建议我们对这些课程进行微观管理.因此基本上输入将通过switch语句,类似于此:

ISoda soda;

switch (input)
{
   case "Coke":
      soda = new Coke();
      break;       
   case "Pepsi":
      soda = new Pepsi();
      break;
   case "DrPepper":
      soda = new DrPepper();
      break;
}
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎有点好,但我仍然认为有更好的方法来做到这一点.过去几天我一直在阅读IoC容器,这似乎是一个很好的解决方案.但是,我对依赖注入和IoC容器仍然很新,所以我不知道如何正确地争论它.或许我错了,有更好的方法吗?如果是这样,有人可以提出更好的方法吗?

我可以提出什么样的论据来说服我的同事尝试另一种方法?有哪些优点/缺点?我们为什么要这样做呢?

不幸的是,我的同事们非常不愿意改变,所以我想弄清楚如何说服他们.

编辑:

好像我的问题有点难以理解.我们要弄清楚的是如何最好地设计一个利用多个接口的应用程序,并包含许多实现这些接口的具体类型.

是的,我知道将这些东西存储在数据库中是一个坏主意,但我们根本不知道更好的方法.这就是为什么我问怎么做,我们做的更好.

public void DrinkSoda(string input)
{
   ISoda soda = GetSoda(input);
   soda.Drink();
}
Run Code Online (Sandbox Code Playgroud)

我们如何正确实施GetSoda?我们应该重新考虑整个设计吗?如果传递这样的魔法字符是个坏主意,那么我们应该怎么做呢?

用户输入诸如"Diet Coke","Coke","Coke …

c# dependency-injection inversion-of-control

8
推荐指数
2
解决办法
3614
查看次数

什么时候记录异常?

try
{
   // Code
}
catch (Exception ex)
{
   Logger.Log("Message", ex);
   throw;
}
Run Code Online (Sandbox Code Playgroud)

在库的情况下,我是否应该记录异常?我应该抛出它并允许应用程序记录它吗?我担心的是,如果我在库中记录异常,将会有很多重复(因为库层将记录它,应用程序层将记录它,以及介于两者之间的任何东西),但如果我不记录它库,很难找到错误.有这方面的最佳做法吗?

logging exception-handling

5
推荐指数
1
解决办法
1471
查看次数

发生异常时要记录什么?

public void EatDinner(string appetizer, string mainCourse, string dessert)
{
   try
   {
      // Code
   }
   catch (Exception ex)
   {
      Logger.Log("Error in EatDinner", ex);
      return;
   }
}
Run Code Online (Sandbox Code Playgroud)

当特定方法发生异常时,我应该记录什么?

我在使用的代码中看到了很多以上内容.在这些情况下,我总是要与遇到错误的人交谈,找出他们在做什么,逐步完成代码,并尝试重现错误.

是否有最佳实践或方法可以最大限度地减少所有这些额外的工作?我应该像这样在每个方法中记录参数吗?

Logger.Log("Params: " + appetizer + "," + mainCourse + "," + dessert, ex);
Run Code Online (Sandbox Code Playgroud)

是否有更好的方法来记录当前环境?如果我这样做,我是否需要为我的应用程序中的每个方法写出所有这些内容?有关此类情景的最佳做法吗?

logging exception-handling exception

5
推荐指数
1
解决办法
541
查看次数