冒着进入神圣战争领域的风险,这些流行的DI/IoC框架有哪些优点和缺点,可以轻松地被认为是最好的?..:
我还没有列出其他用于C#的DI/IoC框架吗?
在我的用例的上下文中,我正在构建一个客户端WPF应用程序,一个WCF/SQL服务基础架构,易用性(特别是在清晰简洁的语法方面),一致的文档,良好的社区支持和性能都是重要因素在我的选择.
所引用的资源和重复问题似乎已经过时,那些了解所有这些框架的人能否提出并提供一些真正的见解?
我意识到关于这个主题的大多数意见可能都有偏见,但我希望有人花时间研究所有这些框架,并且至少进行了一般性的客观比较.
如果以前没有这样做,我非常愿意自己进行调查,但我认为至少有一些人已经这样做了.
如果您有多个DI/IoC容器的使用经验,请对这些容器的优缺点进行排序和总结,谢谢.这不是发现人们制作的所有模糊小容器的练习,我正在寻找流行(和主动)框架之间的比较.
c# dependency-injection ninject ioc-container unity-container
现在有很多依赖 注入框架可供选择.由于您使用的库,您以前经常被迫使用给定的依赖注入框架.但是,Common Service Locator库使库代码独立于注入框架.
学习所有这些所需的时间足以决定使用哪个是不合理的.我不相信我们已经达到了可以讨论最佳依赖注入框架的阶段.那么我应该问什么问题关于项目和我自己来帮助决定在特定情况下使用的最佳依赖注入框架?
了解为什么选择当前使用的依赖注入框架以及您是否仍然对此选择感到满意也很有用.
在比较依赖注入框架的样式时,是否还有一个有用的词汇表?
服务定位器库是否在现实生活中工作,或者您是否被迫在同一项目中使用许多不同的依赖注入框架?
使用每个依赖注入框架对代码进行折射是多么容易,例如ReSharper等工具是否适用于给定的框架?
当我尝试编译以下内容时:
public static delegate void MoveDelegate (Actor sender, MoveDirection args);
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:"modifer'static'对此项无效."
我在一个单例中实现它,有一个单独的类调用委托.问题是,当我在另一个类中使用单例实例来调用委托时(来自标识符,而不是类型),我无论出于何种原因都不能这样做,即使我声明委托是非静态的.显然,当且仅当委托是静态的时候,我才能直接通过类型引用它.
这背后的原因是什么?我使用的是MonoDevelop 2.4.2.
更新
使用以下代码尝试其中一个建议后:
public void Move(MoveDirection moveDir)
{
ProcessMove(moveDir);
}
public void ProcessMove(MoveDirection moveDir)
{
Teleporter.MoveMethod mm = new Teleporter.MoveMethod(Move);
moveDelegate(this, moveDir);
}
Run Code Online (Sandbox Code Playgroud)
我收到了一个处理错误,指出MoveMethod必须是一个类型,而不是标识符.
根据SOLID原则,类不能依赖于其他类,必须注入依赖项.这很简单:
class Foo
{
public Foo(IBar bar)
{
this.bar = bar;
}
private IBar bar;
}
interface IBar
{
}
class Bar: IBar
{
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我希望我的Foo类能够创建Bar,而不知道IBar背后的确切实现呢?我可以在这里考虑4种解决方案,但所有这些解决方案似乎都有缺点:
class Foo
{
public void DoSmth(IBarCreator barCreator)
{
var newBar = barCreator.CreateBar();
}
}
interface IBarCreator
{
IBar CreateBar();
}
class BarCreator : IBarCreator
{
public IBar CreateBar()
{
return new Bar();
}
}
Run Code Online (Sandbox Code Playgroud)
最后一种情况看起来很自然,但BarCreator类的代码太过分了.那你觉得怎么样,哪个最好?
可能重复:
主要的C#DI/IoC框架如何比较?
有那么多的DI容器,我觉得有点迷茫.我是DI模式的新手.
我正在阅读.NET中的Dependency Injection这本书,我发现DI在改进代码库方面非常有用,使它松散耦合并且更易于测试.
我现在想为我的虚拟项目引入一个DI容器,但是有很多可供选择.
我怎么选择Castle Windsor,Unity,StructureMap,Spring.NET,Autofac,Ninject,Funq,LinFu等等?
我想一个连贯的看法就是"选择一个"并开始使用它(因为我认为它们很容易互换,特别是在早期阶段),但我想做出更明智的决定.
我很少听到有人使用.Net 控制反转(Ioc)原理.我有一些使用Java的朋友在Spring和PicoContainer中使用了更多的Ioc.
我理解从代码中删除依赖关系的原则......但我怀疑它是否更好.
为什么.Net程序员不使用(或使用更少)这些类型的框架?如果你这样做,从长远来看,你真的发现了积极的影响吗?
我是3层架构的新手,下面是我的DAL代码
public static int Insert(string firstname, string lastname, DateTime dob, string gender,string email, string password)
{
// bool flag = false;
SqlParameter pid;
SqlParameter result;
SqlConnection con = Generic.DBConnection.OpenConnection();
try
{
SqlCommand cmd1 = new SqlCommand("Insertreg", con);
cmd1.CommandType = CommandType.StoredProcedure;
cmd1.Parameters.AddWithValue("@FirstName", firstname);
cmd1.Parameters.AddWithValue("@LastName", lastname);
cmd1.Parameters.AddWithValue("@Dob", dob);
cmd1.Parameters.AddWithValue("@Gender", gender);
cmd1.Parameters.AddWithValue("@EmailId", email);
cmd1.Parameters.AddWithValue("@Password", password);
result = cmd1.Parameters.Add("@result", System.Data.SqlDbType.Int);
result.Direction = System.Data.ParameterDirection.Output;
pid = cmd1.Parameters.Add("@id", System.Data.SqlDbType.Int);
pid.Direction = System.Data.ParameterDirection.Output;
return cmd1.ExecuteNonQuery();
con.Close();
}
catch (Exception ex)
{
throw ex;
}
}
Run Code Online (Sandbox Code Playgroud)
在BAL中
public …Run Code Online (Sandbox Code Playgroud) 你会向这个领域的初学者推荐什么样的Inversion of Control Container框架?
在阅读了这个问题的好答案后,我观看了Justin Etheredge的截屏视频.这一切看起来都非常好,只需最少的设置就可以从代码中获得DI.
现在我的问题是:为什么你要使用不使用配置文件的DI框架?这不是使用DI基础设施的重点,以便您可以在构建/发布/无论代码之后改变行为("策略",可以这么说)吗?
任何人都可以给我一个很好的用例,使用像Ninject这样的非配置DI进行验证吗?