Comments (5)
Yes, declaring services globally might create import cycles sometimes.
In v2-beta6, we added support for "do.Package" -> https://do.samber.dev/docs/getting-started#register-services-using-package-declaration
You can create a do.Package
in ***/biz/service/
for a subset of your app.
go get -u github.com/samber/do/[email protected]
If you currently use v1, check the migration guide: https://do.samber.dev/docs/upgrading/from-v1-x-to-v2
I currently use v2 in my own project. You can consider it almost production-ready. Some APIs might change before release.
from do.
Thx, I try to do.Package
.
I used v2 in production for some time, it is very good.
from do.
Hello samber, do.Package
doesn't seem to solve my problem.
Maybe I didn't describe it in detail enough. I create a demo: https://github.com/iyaozhen/samber-do-learn/blob/main/service/car/car_test.go
import cycle:
package github.com/iyaozhen/samber-do-learn/service/car
imports github.com/iyaozhen/samber-do-learn/service
imports github.com/iyaozhen/samber-do-learn/service/car: import cycle not allowed in test
TestCar_Start_V2
It is work, but I will add lots of do.Provide
.
service/register.go
, Should it not exist?
I should use do.Package
in car
? But engine used in a other car2 service, car and car2 Lazy/Provide Duplicate?
from do.
Ok, i see your issue.
Maybe you could move your tests to a dedicated package? 🤔
I don't know the complexity of your app, but you can also have a do.Package
in 2 sub-packages (here: service/engine/ and service/car/) and import them in tests: do.New(engine.Pkg, car.Pkg)
.
I don't know if this issue is related to DI, since you would have the same problem in traditional programming.
Did you try with interfaces? Using do.InvokeAs
might prevent some troubles.
from do.
Thank you for your patient answer. There's no particular solution for me.
move your tests to a dedicated package
not golang customary norm
2 sub-packages
car.Package
do.Package(
do.Lazy(engine.NewEngine),
do.Lazy(NewCar),
)
airplane.Package
do.Package(
do.Lazy(engine.NewEngine),
do.Lazy(NewAirplane),
)
https://github.com/iyaozhen/samber-do-learn/blob/main/service/car/car_test.go
panic: DI: service `*/service/engine.Engine` has already been declared
interface
interface is a good way. But it will make the project more complex. In general, there is only one implementation of an interface.
This is not do is problem, the same problem in traditional programming.
I'll close this issue first, If there is a good solution, I will come back to update.
from do.
Related Issues (20)
- v2: Feature Request - expose a method for add lifecycle hook HOT 2
- How can I InvokeNamed T to any HOT 7
- V2 Feature Request: add lifecycle interface support HOT 2
- feat: InjectorOpts.HookBeforePanic HOT 2
- Performance Question about service instnace : getInstance(i Injector) (T, error) HOT 1
- Proposal: way to automate invoke deps in do.Provider for any type constructor HOT 2
- `OverrideTransient` is implemented with `OverrideNamed` instead of `OverrideNamedTransient` in v2.0.0-beta.5 HOT 1
- Expose a method for adding/removing lifecycle hooks at runtime
- Transform hooks into slices of hooks HOT 1
- Add hook at the scope level
- More hooks
- Add telemetry, OTEL, logger...
- `InvokeAs` problems HOT 5
- V2: Bug in parallel shutdown HOT 3
- Add toy examples in Go playground sandboxes
- Need better handling for arrays
- Add TypeMismatch instead NotFound invoke error HOT 1
- Support `interface` in `As`/`InvokeAs` HOT 1
- Proposal: allow service providers registered in the root scope to be invoked with values and other providers in the scoped injector HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from do.