.net 依赖注入是否扩大了一个类的范围,这个类可能是;内部;?

.net 依赖注入是否扩大了一个类的范围,这个类可能是;内部;?,.net,nhibernate,dependency-injection,orchardcms,.net,Nhibernate,Dependency Injection,Orchardcms,如果我打算使用DTO跨层/程序集而不是持久性类传递数据,我可以将对持久性模型中的类的访问限制为同一程序集中的对象 但在像Orchard CMS这样的系统中(使用NHibernate进行ORM,使用AutoFac进行依赖项注入),持久性是通过另一个程序集实现的,其中提供了IRepository进行持久性,系统将IRepository注入到我的程序集的一个类构造函数中,因此它要求持久性类T是公共的。如果没有依赖项注入,我可以将T定义为内部,并在我的汇编代码中使用IRepository,依赖项注入是否

如果我打算使用DTO跨层/程序集而不是持久性类传递数据,我可以将对持久性模型中的类的访问限制为同一程序集中的对象


但在像Orchard CMS这样的系统中(使用NHibernate进行ORM,使用AutoFac进行依赖项注入),持久性是通过另一个程序集实现的,其中提供了
IRepository
进行持久性,系统将
IRepository
注入到我的程序集的一个类构造函数中,因此它要求持久性类T是公共的。如果没有依赖项注入,我可以将T定义为内部,并在我的汇编代码中使用
IRepository
,依赖项注入是否要求类始终是公共的?

是,以便容器能够实例化和提供依赖项,1将可注入依赖项的范围扩展到
public

事实上,依赖倒置原则的另一个常见(且被误导的)“抱怨”是,现在被注入的类的所有内部依赖通常都暴露在公共构造函数上——似乎违反了OO最初的“3个朋友”原则,它具有一个类的内部依赖项,这些依赖项牢牢隐藏在公众视线之外

取舍当然是通过
new
实例化将类直接耦合到其依赖项,这防止了解耦,更糟糕的是,妨碍了测试,在后固体时代的代码中,测试被认为是第一类设计问题

需要记住的一点是,按照约定,类之间的耦合应该总是通过接口进行的——这样,实际上“使用”这些公共类和构造函数的唯一参与者将是容器本身,以及您的单元测试

举例来说:

存储库程序集

public interface IFooRepo
{
     Task<IEnumerable<Foo>> FindFoos(Predicate predicate);
     // ...
}

// For IoC and testing purposes, MyFooRepo must be public
public class MyFooRepo : IFooRepo
{
    // .. Implement
}
// Note : No indication of the IFooRepository dependency here
public interface IMyService
{
    Task DoAmazingThingsWithFoo();
}

// MyService class must also be public for IoC and tests
public class MyService : IMyService
{
     private readonly IMyRepo _repo;
     // Dependencies are publically visible on the constructor
     public MyService(IMyRepo repo)
     {
        _repo = repo;
     }
   // ... Implement
 }
国际奥委会引导

Bind<IFooRepo>().To<MyFooRepo>(); // Can also specify lifetimes etc
Bind<IMyService>().To<MyService>();
Bind().To();//还可以指定寿命等
绑定()到();
进一步阅读——马克·希曼深入辩护



[1] Steven是SimpleInput的主要作者

您指出“耦合通常应针对接口”,虽然我的示例也针对接口,但接口本身绑定到公共类(IRepository),因此耦合仍然针对类而不是接口,有没有更好的方法使我仍然可以只耦合到接口?我的意思是依赖于其他类的类应该只通过接口(实体的D)耦合。IoC引导本身从来都不是一件优雅的事情——它通常会定义在需要接口依赖项时要使用的具体类(一些IoC甚至会根据命名约定自动绑定)。我更新了一个例子——希望这能澄清问题。