依存性注入との利便性の愛または結婚?

私の記事では、間違った例、私の意見では、依存性注入の原則の使用を検討し、他のチーム開発者(またはおそらく他の誰かが行うかもしれません)がより良いコードを書くための動機を見つけようとします文盲の方法で、リファクタリングを行います。



だから、問題の本質。 プロジェクトでは、OData WebApiを使用し、すべてのコントローラーはベースから継承し、ベースクラスのGetServiceメソッドを使用します。これは、ApiControllerScopeContextMediator静的クラスを介して依存関係をプルします。



public abstract class ODataControllerBase : ODataController { protected T GetService<T>() { return ApiControllerScopeContextMediator.GetService<T>(this); } } internal static class ApiControllerScopeContextMediator { internal static T GetService<T>(ApiController controller) { return (T) controller.Configuration.DependencyResolver.GetService(typeof (T)); } }
      
      





Global.asaxでは、StructureMapを介してODataの依存関係プルを構成します。



  GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver(container);
      
      





すべてのアクションで、コントローラーは、たとえば次のように、あらゆる場所でGetServiceメソッドを使用します。



 public class DisconnectedAppsController : ODataControllerBase { public IHttpActionResult Get() { var query = GetService<IQuery<IQueryable<DisconnectedAppDomain>, DisconnectedAppFilter>>(); } }
      
      





しかし、なぜですか? 結局、コンストラクターインジェクションを使用することができます。



 public DisconnectedAppsController(IQuery<IQueryable<DisconnectedAppDomain>, DisconnectedAppFilter> query){ _query = query; }
      
      





それで、「タヒチ、タヒチ」(コンストラクターインジェクション)または「彼らはここで私たちによく食べさせます」(GetService)?



私が見るこのコードの問題:





私が聞いた反対意見は何ですか:





数年前、Mark Simanの本Dependency Injectionを読みました。 私は座って考えますが、DIと私はどうですか?利便性の愛または結婚?



使用材料:



マーク・シーマン「依存性注入」

マーク・シーマンのブログ

Microsoft MVC6 githubオープンソースプロジェクト

SOLID wikiページ

YAGNI wikiページ

KISS wikiページ



All Articles