How would one do dependency injection in scala?

送分小仙女□ 提交于 2019-12-20 08:27:46

问题


I'm still at the beginning in learning scala in addition to java and i didn't get it how is one supposed to do DI there? can or should i use an existing DI library, should it be done manually or is there another way?


回答1:


Standard Java DI frameworks will usually work with Scala, but you can also use language constructs to achieve the same effect without external dependencies.




回答2:


A new dependency injection library specifically for Scala is Dick Wall's SubCut.

Whereas the Jonas Bonér article referenced in Dan Story's answer emphasizes compile-time bound instances and static injection (via mix-ins), SubCut is based on runtime initialization of immutable modules, and dynamic injection by querying the bound modules by type, string names, or scala.Symbol names.

You can read more about the comparison with the Cake pattern in the GettingStarted document.




回答3:


Dependency Injection itself can be done without any tool, framework or container support. You only need to remove news from your code and move them to constructors. The one tedious part that remains is wiring the objects at "the end of the world", where containers help a lot.

Though with Scala's 2.10 macros, you can generate the wiring code at compile-time and have auto-wiring and type-safety.

See the Dependency Injection in Scala Guide




回答4:


A recent project illustrates a DI based purely on constructor injection: zalando/grafter

What's wrong with constructor injection again?

There are many libraries or approaches for doing dependency injection in Scala. Grafter goes back to the fundamentals of dependency injection by just using constructor injection: no reflection, no xml, no annotations, no inheritance or self-types.

Then, Grafter add to constructor injection just the necessary support to:

  • instantiate a component-based application from a configuration
  • fine-tune the wiring (create singletons)
  • test the application by replacing components
  • start / stop the application

Grafter is targeting every possible application because it focuses on associating just 3 ideas:

  • case classes and interfaces for components
  • Reader instances and shapeless for the configuration
  • tree rewriting and kiama for everything else!



回答5:


I haven't done so myself, but most DI frameworks work at the bytecode level (AFAIK), so it should be possible to use them with any JVM language.




回答6:


Previous posts covered the techniques. I wanted to add a link to Martin Odersky's May 2014 talk on the Scala language objectives. He identifies languages that "require" a DI container to inject dependencies as poorly implemented. I agree with this personally, but it is only an opinion. It does seem to indicate that including a DI dependency in your Scala project is non-idiomatic, but again this is opinion. Practically speaking, even with a language designed to inject dependencies natively, there is a certain amount of consistency gained by using a container. It is worth considering both points of view for your purposes.

https://youtu.be/ecekSCX3B4Q?t=1154




回答7:


In addition to the answer of Dan Story, I blogged about a DI variant that also uses language constructs only but is not mentioned in Jonas's post: Value Injection on Traits. This pattern is working very well for me.




回答8:


I have shown how I created a very simple functional DI container in scala using 2.10 here.



来源:https://stackoverflow.com/questions/2563929/how-would-one-do-dependency-injection-in-scala

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!