首先,我使用的是 Simple Injector,但我认为这个问题可以适用于任何 DI 框架。
在创建要为应用程序注册的服务时,通过其构造函数将服务容器传递给服务是否被认为是不好的做法?
例如。考虑以下代码。
//IServiceInterface.cs
interface IServiceInterface {}
//MyService.cs
//All standard using statements here...
using SimpleInjector;
class MyService : IServiceInterface
{
private _container {get; set;}
public MyService(Container container)
{
_container = container;
//Construct!
}
}
//MyApp.cs
public Contrainer container;
....
//My application bootstrapper method
void Bootstrap()
{
var container = new Container();
container.RegisterSingle<IServiceInterface >(() => new MyService(container));
container.Verify();
this.container = container;
}
从上面的方法可以看出,我定义了一个服务类,它接受一个 Simple Injector 容器。当我注册容器时,我将与我的应用程序关联的容器传递给服务。
当您定义将在单独项目中的服务时,这似乎是一种有用的方法,甚至可能在不同的命名空间中,需要在应用程序生命周期的某个时间点注册新服务。但是,我在任何示例中都没有看到这样做,在我尝试这样的事情之前,我想确保这种方法是正确的。
这种行为是否被认为是良好的 DI 实践?如果没有,您如何获取应用程序的 DI 容器,并根据需要从服务中注册新服务?
更新——更多细节
我决定开始在一个新项目中使用依赖注入,原因有两个。第一,这是一个庞大的项目,可能包括 10-12 个 Visual Studio 项目,第二,其中许多项目包含我多年来从一个应用程序复制并粘贴到另一个应用程序的代码,然后稍作修改。被需要。够了,是时候编写我自己的业务逻辑框架了,它适用于我们公司,因为我们需要它。
这个第一个大项目似乎是从 DI 和我的自制框架开始的地方。为了一次构建和测试这个应用程序的一层,我定义了很多接口和“shell”服务类。这样,我可以连接我的顶级应用程序,并在他们的项目完成并链接到我的解决方案时更新依赖项。
由于这是一个如此大的应用程序,我有服务,这将需要依赖于服务......这将进一步依赖于服务。
我的想法是我的应用程序应该只注册它需要验证我的用户和加载视图的服务。视图服务应该注册模型视图。ModelView 服务应该注册它们关联的模型服务,这将注册数据库连接服务......叹气,它最终将注册一个服务器端同步服务,它将注册一个本地数据库连接服务和 Web 应用程序服务。呸!听起来很混乱?嗯,有点像。
我的想法是我可以定义这些可以接受 Container 对象的类,然后每个服务将使用该容器来获取可能已经存在的任何底层服务,或者如果尚未创建一个则实例化一个新服务。
例如,我的用户身份验证服务可能会通过ILocalDB
应与我的模型服务共享的服务缓存信息。如果我在启动我的应用程序时注册所有这些服务,该应用程序将变得迟缓,并且整个注册过程看起来很粗糙。
我认为必须有一个优雅的解决方案。我错过了什么?