基类中的构造函数依赖注入我正在使用实体框架构建存储库基类,所有实体存储库都将继承。我想使用Ninject使用依赖注入在基类中注入DatabaseContext。我认为构造函数注入是正确的方法,但是在派生类中使用构造函数注入执行此操作我必须将参数传递给基类中的构造函数,这是我不想要的。那么,SetterInjection是不是更合适呢?这是我的代码:publicabstractclassBaseRepository:IDisposablewhereTEntity:class{privatereadonlyDatabaseContext_databaseContext;protectedBaseRepository(DatabaseContextdatabaseContext){this._databaseContext=databaseContext;在上面使用构造函数注入的示例中,在我的派生类中,我必须将databaseContext对象传递给基类,我不喜欢对我的所有派生类都这样做:publicclassUsuarioRepository:BaseRepository,IUsuarioRepository{publicUsuarioRepository(DatabaseContextdatabaseContext):base(databaseContext){}}Setter注入而不是构造函数注入是解决这个问题的好方法吗?什么是最好的方法?更新:使用Setter注入,我的派生类将没有构造函数:publicclassUsuarioRepository:BaseRepository,IUsuarioRepository{}我的上下文只是所有应用程序之一。我不需要派生类来传递上下文对象,但我喜欢将它注入基类以供将来的模拟测试使用。我解决了这个问题:抱歉,我对这个问题感到困惑,但我正在解决构建工厂的问题:protectedDatabaseContextCurrentContext{get{返回this._contextFactory.GetCurrentContext();我的派生类看起来像这样:publicclassUsuarioRepository:BaseRepository,IUsuarioRepository{}和我的工厂:publicclassContextFactory{publicDatabaseContextGetCurrentContext(){returnnewDatabaseContext();属性注入意味着依赖是可选的,而构造函数注入意味着依赖是必需的。相应地选择一种模式。在95%以上的情况下,构造函数注入是正确的模式。你不喜欢怎么办?我认为没有“最佳方法”。构造函数和setter注入并不完全相同,因为setter注入给你更多的灵活性。这是我在两者之间做出的选择:假设您创建了一个对象A,而A需要一个B对象才能工作。要问的问题是:A是否有可能在没有与之相关的B的情况下存在/被实例化?它是没有B的A对象的有效状态吗?有时A没有空闲B没有意义,那么构造函数注入是一个更好的解决方案。如果B可以稍后分配给A,不一定在构造时,则使用setter注入。所有这些都取决于您尝试建模的领域,答案会因情况而异。真的,我没有看到将参数传递给基类有任何问题。但如果这是一个绝对要求,你总是可以这样做:}现在你的派生类看起来像这样:publicclassUsuarioRepository:BaseRepository,IUsuarioRepository{publicUsuarioRepository(DatabaseContextdatabaseContext){_databaseContext=databaseContext;}protectedoverrideDatabaseContextGetContext(){return_databaseContext;在构造函数注入的情况下。但这确实是一回事。老实说,我不喜欢setter注入的想法,因为它看起来像DatabaseContext是必需的依赖项。对于所需的依赖项,执行构造函数注入。如果它是可选的,那么一定要继续进行第二次注射。编辑:由于我们在评论中进行了长时间的对话,我对您要完成的工作有了更好的理解。如果您想将派生类与DatabaseContext分离,最好以不同的方式进行设计。很难将派生类与它们的基类依赖项分离,如果您认为它们应该分离,那么您最好设计为根本不使用继承。publicclassBaseRepository:IDisposablewhereTEntity:class{publicBaseRepository(DatabaseContextcontext){}}现在您的派生类(不再导出)如下所示:publicclassUsuarioRepository:IUsuarioRepository{publicUsuarioRepository(BaseRepositoryrepository){}//实现其他methodshere}您现在可以拥有一个使用DatabaseContext的基类,而派生类不再依赖于它。这三种方式1.Conterstructor,2.Setter和3.InterfaceInjection各有利弊,看使用情况。如果我处于你的位置,我会选择setter,尽管接口也是一个不错的选择。请阅读这篇文章http://www.devx.com/dotnet/Article/34066以上是C#学习教程的全部内容:基类中的构造函数依赖注入。如果对您有用,需要了解更多C#学习教程,希望您多多关注—本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
