C# IoC和.NET框架

C# IoC和.NET框架,c#,.net,ioc-container,C#,.net,Ioc Container,我想知道在处理.NET时,IoC模式的最佳实践是什么 例如,我应该通过IoC容器或使用简单的新关键字创建SqlConnection/OracleConnection或任何其他提供者吗 将类与具体的提供程序类型分开是否有任何价值(包括当我只想使用一种提供程序类型时)?IOC存在,因此尽管您希望在现实中使用一种类型的提供程序,但总有一天会发生一些变化,您可能需要一个辅助适配器,因此最好使用IOC,而不是使用新关键字创建对象。随着时间的推移(随着需求的变化),IoC可以灵活地进行更改。即使在.NET课

我想知道在处理.NET时,IoC模式的最佳实践是什么

例如,我应该通过IoC容器或使用简单的新关键字创建
SqlConnection
/
OracleConnection
或任何其他提供者吗


将类与具体的提供程序类型分开是否有任何价值(包括当我只想使用一种提供程序类型时)?

IOC存在,因此尽管您希望在现实中使用一种类型的提供程序,但总有一天会发生一些变化,您可能需要一个辅助适配器,因此最好使用IOC,而不是使用新关键字创建对象。随着时间的推移(随着需求的变化),IoC可以灵活地进行更改。

即使在.NET课程中也可以使用IoC。这将允许您的代码仅绑定到接口或基类(如果可用)。不仅如此,您还可以使用IoC框架指定构造函数参数。这对于SqlConnection中的连接字符串可能很有用


我还应该提到,使用IoC和只向接口编写代码将使单元测试更容易。在处理数据库连接时尤其如此。

代码维护不仅仅是将一个提供程序换成另一个提供程序。对我来说,依赖注入更多的是保持代码在逻辑上是分离的,因此更易于维护,而不是在提供者发生变化时对代码进行未来验证

DI还允许您更容易地将代码从一个项目重用到另一个项目,因为它使各个部分之间的依赖关系更加明确

也就是说,我从未使用过国际奥委会的容器,我也从未看到有必要使用它,因此我无法对这个问题的这一方面发表评论


但是您肯定应该尽可能地从代码中删除隐式依赖项,以保持代码的可重用性、可维护性和正确性。

如果您使用IDbConnection和所有其他类,而不是具体的类,那么它可能对单元测试有价值

除了IOC之类的东西,我实际上已经多次使用()来创建连接和其他与DB相关的对象,并通过ConnectionString读取提供程序

DB的主要问题是,通常情况下,您不能只在数据库中使用ANSI-SQL,因此,当您与具体类分离时,您的SQL是不可传输的。(MySql或Sql Server中的i/e限制和分区)

关于DI/IOC和其他与DB无关的东西,将类解耦并删除依赖项非常好,在单元测试时很有帮助,比如说,当您有一个服务时,即使不在单元测试中,这也很有帮助,当您针对某个服务工作,而另一个团队仍在开发该服务时,您可以创建一个假的服务,它基本上解决了您的问题(不是全部),这样您就可以在真正的服务可用之前针对某个服务工作


还有更多的例子,但是针对服务(DB repository/web/authorization/which)的工作是第一个最直接的附加值。

注入
SqlConnection
IDbConnection
将非常无用,因为DbConnection是一个泄漏的抽象。您只能使用它来调用存储过程或简单的
SELECT*FROM VIEW
类型查询。任何更复杂的查询都会因SQL方言而异

如果将连接本身隐藏在更高级别的抽象(例如
IUserRepository
或某种抽象)之后,您将有更好的成功机会。该接口的默认实现可能是与MS SQL Server通信的
SqlUserRepository
,或与Oracle通信的
OracleUserRepository

更好的做法是从低级的ADO.NET DbConnection API转移到O/RM,如LINQ到SQL或实体框架。然后通常会有一个
LinqToSqlUserRepository


注意,在这种情况下,我仍然在谈论
XXXUserRepository
。界面仍然没有改变。换句话说:
IUserRepository
不是一个泄漏的抽象。您可以将此接口替换为单元测试,而在使用
SqlConnection

时,这几乎是不可能的。如果有一天我想使用另一种类型,我认为MEF更适合此用途。如果我错了,请纠正我。在这种具体情况下使用IoC不是通过松散耦合代码来提高代码质量吗?是的,这就是为什么它是灵活的。。。我没有说任何反对你的声明的话,也没有公开表示支持,但这并不意味着我所说的是错的……我必须强烈反对,并说国际奥委会的存在是为了让你能够按照单一责任原则将功能分解成更小的部分,并通过合同代表这些部分的功能(接口)而不会产生实例化和提供更多小组件的巨大负担(这是IOC处理的部分)。好吧,你让我说“DI更多的是关于解耦,而不是关于你的提供商的未来证明。”很遗憾你没有更多的DI经验。但是+1。我知道关于存储库和orm的:)我刚刚写了一个非常简单的用法示例:)无论如何感谢+1“注入SqlConnection或IDbConnection将非常无用,因为DbConnection是一个泄漏的抽象”非常正确。伙计们,泄漏抽象意味着什么?@Davita:你试过谷歌搜索吗?维基百科(当然)有这样的定义:。