如何动态创建结构体并作为泛型参数解决DI实例覆盖问题
问题描述
以下是可运行的示例代码:
package main type ( builder struct{} ISomething interface { DoSomething() } IMyStruct interface { MySomething() } myStruct struct { Num int Something ISomething } Something struct{} ) func AddSingleton[T any](b *builder, ctor any) {} func (m *myStruct) MySomething() {} func (s *Something) DoSomething() {} func main() { var something ISomething = &Something{} b := &builder{} for i := 0; i < 2; i++ { AddMyStruct(b, something, i) } } func AddMyStruct(b *builder, something ISomething, num int) { AddSingleton[*myStruct](b, func(something ISomething) *myStruct { return &myStruct{Num: num, Something: something} }) AddSingleton[IMyStruct](b, func(obj *myStruct) IMyStruct { return obj }) }
使用的DI库要求以下代码片段中传入的obj为唯一类型:
AddSingleton[IMyStruct](b, func(obj *myStruct) IMyStruct { return obj })
该类型会被添加到DI容器中,但通过IMyStruct获取实例时,只会返回最后添加的那个。在for循环中添加2个实例后,请求[]IMyStruct会得到2个实例,但均为最后添加的*myStruct(即objs[0].Num == 1、objs[1].Num == 1,预期应为0、1)。
尝试过通过泛型实现类型唯一性:
type myStruct[T any] struct { Num int Something ISomething }
但这种方式无法在循环中使用。
考虑动态创建与原myStruct完全一致的唯一结构体类型,使DI容器中每个实例对应唯一类型,避免"只能存在一个"的冲突问题。
希望能提供反射实现方案,以避免重复编写AddMyStruct逻辑。
内容的提问来源于stack exchange,提问作者Herb Stahl
相关产品推荐
相关产品推荐

