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);
这就是实现,但我的问题是我什么时候使用?
- 构造函数注入
- 塞特注射
- 界面注入
当依赖项随每个方法调用而变化时,最好使用方法注入。当依赖项本身表示一个值时可能会出现这种情况,但当调用方希望向使用者提供有关调用操作的上下文的信息时,通常会出现这种情况。在可能的情况下,我使用构造函数传递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是的,我刚刚发现了那个可爱的打字错误。这是我的一个失败。我将用那篇文章进一步深入兔子洞。谢谢你,我会复习的。