我已经使用了Castle Windsor很多。它有一个非常方便的工具,可以通过反射注册类型。例如,我会在应用程序启动时做这样的事情:
container.Register(Classes.FromThisAssembly().BasedOn<IMyInterface>().LifestyleTransient());
所以,假设我有一堆数据格式化提供程序 - 我可以将它们全部(通过接口)注册到那一行。更好的是,当我创建新的(假设它们在同一个程序集和相同的界面中)时,它们也会被注册;编码时我不必记得这样做。
ServiceStack在Funq容器中的实现是否相同?我环顾四周,似乎没有看到一个。
答案 0 :(得分:1)
一个接口只能有一个实现,但是如果你想通过扫描注册实现接口的所有具体类型来查找所有类型并预先注册它们:
var fooTypes = assembly.GetTypes().Where(x => x.HasInterface(typeof(IFoo)));
container.RegisterAutoWiredTypes(fooTypes);
如果需要,可以通过以下方式检索:
var fooInstances = fooTypes.Select(c.Resolve).Cast<IFoo>();
也可以将其注册为依赖项:
container.Register(c => fooTypes.Select(c.Resolve).Cast<IFoo>());
您的类可以使用属性注入进行访问:
public IEnumerable<IFoo> FooInstances { get; set; }