首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将具有泛型的接口注入Nancy Bootstrapper

将具有泛型的接口注入Nancy Bootstrapper
EN

Stack Overflow用户
提问于 2014-07-09 08:22:44
回答 1查看 400关注 0票数 1

我在一次测试中遇到了一些奇怪的行为。下面是测试代码:

代码语言:javascript
复制
    protected IAuditingService<BillingAudit> FakeBiometricsService;
    protected Browser Browser;

    [TestInitialize]
    public void Initialize()
    {
        FakeBiometricsService = A.Fake<IAuditingService<BillingAudit>>();
        A.CallTo(() => FakeBiometricsService.UpdateAudit(A<BiometricAudit[]>.Ignored)).DoesNothing();
        Browser = new Browser(c => c.Module<Biometrics>().Dependency(FakeBiometricsService));
    }

    [TestMethod]
    public void calling_endpoint_with_correct_data__calls_biometrics_service_to_save_data()
    {
        var response = Browser.Post("/Audits/Biometrics", with =>
                                                   {
                                                       with.HttpRequest();
                                                       with.Header("accept", "application/xml");
                                                       with.Body(JsonConvert.SerializeObject(new
                                                           {
                                                               data = new[]
                                                                   {
                                                                       new
                                                                           {
                                                                               SomeProperty = SomeValue
                                                                           }
                                                                   }
                                                           }));
                                                   });
        response.StatusCode.Should().Be(HttpStatusCode.OK);
        A.CallTo(() => FakeBiometricsService.UpdateAudit(A<BiometricAudit[]>.Ignored)).MustHaveHappened();

所以我在这里要做的就是用我的A.Fake<IAuditingService<BillingAudit>>()满足一个约束

下面是我的模块的外观。每个模块都扩展了这个基类:

代码语言:javascript
复制
public abstract class AuditModuleBase<TModel, TService> : NancyModule  where TModel : BillingAudit, new() where TService : IAuditingService<TModel>, new()
{
    private readonly IAuditingService<TModel> _auditingService;

    protected AuditModuleBase(string endpoint, TService auditingService)
        : base("/Audits/" + endpoint)
    {
        _auditingService = auditingService;
        Post["/"] = x =>
        {
            var data = Request.Body.FromJson<JObject>();
            return SaveLocationUpdates(data["data"].Children().Select(y => (TModel)new TModel().Parse(y)).ToArray());
        };
    }

    private Response SaveLocationUpdates(TModel[] update)
    {
        _auditingService.UpdateAudit(update);
        return new Response();
    }
}

所以,我的生物识别模块看起来像这样:

代码语言:javascript
复制
public class Biometrics : AuditModuleBase<BiometricAudit, BiometricsAuditingService>
{
    public Biometrics(BiometricsAuditingService service) : base("Biometrics", service) { }
}

很抱歉代码转储。其思想是每个模块都扩展了一个基类,该基类需要一个BillingAudit类型的T和一个IAuditingService。但是,当我将这个伪函数传递给浏览器对象中的依赖满足器时,Nancy会查找IAuditingService>的实际实现并传递给它,这并不是我们想要的行为!在满足FakeItEasy伪装的依赖性方面有问题吗?或者与泛型的接口?或者是我忽略了什么很明显的东西?

编辑:哦,我还想提一下BiometricAudit扩展了BillingAudit。所以它是一个带有抽象类泛型的接口。我试过伪造IAuditingService和IAuditingService,但似乎都不能让南希满意。

EN

回答 1

Stack Overflow用户

发布于 2014-07-10 01:06:51

啊,没有我想的那么令人兴奋。抱歉的!我只是在犯傻。

我试图满足类型为BiometricsAuditingService的依赖项,这是IAuditingService的一个具体实现。一旦我将其更改为一个接口,一切都会正确注入。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24643601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档