Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 五个W';因为它让我的大脑爆炸_C#_Interface_Dependency Injection_Inversion Of Control - Fatal编程技术网

C# 五个W';因为它让我的大脑爆炸

C# 五个W';因为它让我的大脑爆炸,c#,interface,dependency-injection,inversion-of-control,C#,Interface,Dependency Injection,Inversion Of Control,所以控制反转是一个模糊的描述,所以依赖注入成为了新的定义。这是一个非常非常强大的解决方案,对于从未遇到过它的人来说,很可能同样令人困惑 所以,为了不让自己成为头灯下的一只鹿,我读了很多书。我发现了几本很棒的书和网上帖子。但就像所有美好的事物一样,更多的问题出现了,而不是答案 问题是,从一个未知的项目中吸收变量,一旦它们被引入到我的项目中就要实现 解决方案: public interface ISiteParameter { Guid CustomerId { get; set; }

所以控制反转是一个模糊的描述,所以依赖注入成为了新的定义。这是一个非常非常强大的解决方案,对于从未遇到过它的人来说,很可能同样令人困惑

所以,为了不让自己成为头灯下的一只鹿,我读了很多书。我发现了几本很棒的书和网上帖子。但就像所有美好的事物一样,更多的问题出现了,而不是答案

问题是,从一个未知的项目中吸收变量,一旦它们被引入到我的项目中就要实现

解决方案:

public interface ISiteParameter
{
    Guid CustomerId { get; set; }
    string FirstName { get; set; }
    string LastName { get; set; }
    string Phone { get; set; }
}
我的注射器:

public interface IInjectSiteParameter
{
     void InjectSite(ISiteParameter dependant);
}
然后我创建了这个:

public class SiteContent : IInjectSiteParameter
{
    private ISiteParameter _dependent;

    #region Interface Member:
    public void InjectSite(ISiteParameter dependant)
    {
        _dependant = dependant;
    }
    #endregion
}
然后,为了使用共享引用来实现它,我创建了一个要实现的类,如下所示:

public class SiteParameters : ISiteParameter
{    
   public Guid Customer Id { get; set; }
   public string FirstName { get; set; }
   public string LastName  { get; set; }
   public string Phone { get; set; }
}
现在,
SiteParameters类
将被其他项目引用;这将允许我在任何时候、任何地点使用以下命令调用这些属性:

ISiteParameter i = new ISiteParameter();
MessageBox.Show(i.Guid + i.FirstName + i.LastName + i.Phone);
这就是实现,但我的问题是我什么时候使用?

  • 构造函数注入
  • 塞特注射
  • 界面注入
你什么时候会用其中一个?对于我提到的任务,我是否应该执行如此困难的任务,以适应对其他项目所做的任何更改

我是否在思考过程中偏离了曲线?

摘自马克·希曼的《圣经》第四章

构造函数注入应该是DI的默认选择。它解决了类需要一个或多个依赖项的最常见场景。如果dependent类在没有依赖项的情况下绝对不能运行,那么保证是有价值的

只有当您正在开发的类具有良好的本地默认值,并且您仍然希望调用方能够提供该类依赖关系的不同实现时,才应该使用属性注入。在框架要求您具有默认构造函数(如ASP.NET页面)的情况下,也可以使用属性注入


当依赖项随每个方法调用而变化时,最好使用方法注入。当依赖项本身表示一个值时可能会出现这种情况,但当调用方希望向使用者提供有关调用操作的上下文的信息时,通常会出现这种情况。

在可能的情况下,我使用构造函数传递depdenicies,而不是通过方法调用进行注入

例如:

public interface IWebHost 
{ 
   string DoSomething(string input); 
} 

public class FooManager 
{
   private IWebHost _host; 
   public FooManager(IWebHost host)
   {  
      _host = host; 
   } 

   public void Process()
   { 
      // do something with _host 
   }
} 
这有很多好处,但我认为最有益的两个:

  • 我的依赖项是预先指定的,错过一个的可能性更小
  • 我可以使用依赖项注入存储库自动地为我进行构建
有些情况下,这样做是不可能或不切实际的,但大多数情况下都可以通过为我建造工厂来解决

另一个例子:

public interface IConnection : IDisposable 
{
   string DoSomething(string input); 
   // implement IDisposable
}

public interface IConnectionFactory 
{
   IConnection CreateConnection(); 
} 

public class DerpConnection : IConnection 
{
    // implementation
} 

public class DerpConnectionFactory : IConnectionFactory 
{
  // We only return DerpConnections from this factory.  

  IConnection CreateConnection() { return new DerpConnection(); } 
}

public class BarManager 
{ 
   private IConnectionFactory _connectionFactory; 
   public BarManager(IConnectionFactory connectionFactory)
   {   
      _connectionFactory = connectionFactory;
   } 

   public void Manage()
   {
      using(var connection = _connectionFactory.CreateConnection()) 
      { 
        // do something here. 
      } 
   }
}
在本例中,DI框架只需要知道
IConnectionFactory
,而Factory实现直接构造
DerpConnection
。在单元测试中,我可以轻松模拟工厂和IConnection响应


这种情况不可能发生,通常表示某种情况,或者类比它需要的复杂得多(并且正在违反)

我推荐您尝试DI,它确实很强大。由于您已经进行了设置,所以简单地通过签名将特定值传递给您的方法并没有多大好处。当您的ISiteParameter实例与其他ISiteParameter实例不同,持有特定于其行为的已定义方法时,真正的力量就会出现。@KodeKreachor我正在思考如何实现其中的一些好处。但我是DI/IoC的处女。必须指出,你正在尝试实例化一个
接口
。@SimonWhitehead是的,我刚刚发现了那个可爱的打字错误。这是我的一个失败。我将用那篇文章进一步深入兔子洞。谢谢你,我会复习的。