gpt4 book ai didi

go - revel 依赖注入(inject)

转载 作者:IT王子 更新时间:2023-10-29 01:44:02 25 4
gpt4 key购买 nike

我希望让我的 revel Controller 使用各种服务,我模拟这些服务以进行单元测试。我是新来的;在 C# 中,我会使用依赖注入(inject)来注入(inject)它们。在 revel 中有一种通用的方法可以做到这一点吗?

我发现的最好方法似乎是在 Controller 的 Before() 方法中初始化真实服务(可能使用通过线路解决的方法),并在测试的 Before() 方法中设置模拟版本.或者有更好的方法吗?

最佳答案

我使用 filter注入(inject)依赖项。

过滤器测试 Controller 是否实现特定接口(interface)并填充正确的依赖项。下面是一个插入与数据库相关的依赖项的示例:

func DependencyFilter(c *revel.Controller, filterChain []revel.Filter) {
if ctrl, ok := c.AppController.(DataServiceController); ok {
ctrl.SetDataService(<your dependency>)
}

// Different dependencies could be injected here:
//if ctrl, ok := c.AppController.(FooController); ok {
// ctrl.SetFooService(<your dependency>)
//}

// Call the next filter
if len(filterChain) > 0 {
filterChain[0](c, filterChain[1:])
}
}

DataServiceController 是:

type DataServiceController interface {
SetDataService(ds services.DataService)
}

我在 init.go 中将我的过滤器作为倒数第二个条目插入:

revel.Filters = []revel.Filter{
revel.PanicFilter, // Recover from panics and display an error page instead.
// ...
DependencyFilter, // Add dependencies
revel.ActionInvoker, // Invoke the action.
}

我的大多数 Controller 都需要相同的依赖项,所以我有一个它们都嵌入的基本 Controller :

type BaseController struct {
*revel.Controller
DataService services.DataService
}

func (c *BaseController) SetDataService(ds services.DataService) {
c.DataService = ds
}

所以我的具体 Controller 看起来像这样:

type Home struct {
BaseController
}

func (c Home) Index() revel.Result {
// ...
}

可能有更好的方法,但这是我的方法。

关于go - revel 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53047617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com