2012-08-16 158 views
2

我实现了自定义OutputCacheProvider传递构造函数参数OutputCacheProvider

public class MongoDBCacheProvider : OutputCacheProvider, IDisposable { ... }

的的CacheProvider注册像这样:

<outputCache defaultProvider="MongoDBCacheProvider" enableOutputCache="true" > 
    <providers> 
    <add name="MongoDBCacheProvider" type="Mynamespace.Core.Caching.MongoDBCacheProvider, Mynamespace.Core" /> 
    </providers> 
</outputCache> 

我需要一些参数传递给构造函数。我想用Ninject来绑定我的缓存提供者。

this.Bind<System.Web.Caching.OutputCacheProvider>() 
    .To<Core.Caching.MongoDBCacheProvider>() 
    .WithConstructorArgument("databaseName", dbName); 

更多参数必须通过,但这只是一个例子。我相信简单的解决方案存在以某种方式获得该字符串,但我宁愿使用Ninject,就像我用于所有其他类。

失败,消息:“没有为此对象定义的无参数构造函数”。以下绑定也不起作用。

this.Bind<Core.Caching.MongoDBCacheProvider>().ToSelf() 
    .InSingletonScope() 
    .WithConstructorArgument("databaseName", dbName); 

我已验证绑定在发生错误之前运行。 ASP .NET以某种方式绕过ninject绑定。 似乎没有任何方法可以插入工厂。

有谁知道我可以通过构造函数参数来派生OutputCacheProvider?

谢谢。

+1

您100%Ninject被要求做创作(为什么不包括堆栈跟踪)?您是否搜索过与ASP.NET有多相似(认为成员资格提供者,但只有90%确定比较有效)的对象是在DI容器的控制下进行管理的? – 2012-08-18 07:03:36

+0

@Ruben我已经验证过,它只是通过在那里放置一个断点来加载,在出现错误之前它被命中。发生错误时,我没有给出堆栈跟踪。我遵循了你的建议,并尝试了同样的方法来获得membershipProvider。这确实按预期工作。一个关键的区别可能是,为了测试成员资格提供者,我必须将它作为参数添加到控制器,而cacheprovider不会作为参数传递到任何地方。 ASP .Net本身构建并完全在视图之外使用它。这可能会有所作为吗?谢谢。 – 2012-08-18 13:16:21

+1

当然可以做一个差异。 IIRC(搜索@Remo Gloor的博客获取更多授权信息),成员资格提供程序工作的方式是,启动程序提取提供程序,然后对ASP.NET创建的对象执行“Kernel.Inject”。如果不是这样,那么它会创建它并将其传递下去。你需要了解谁能够创建它。如果答案是“仅限SAP.NET /系统”,那么所有可以完成的工作就是在对象上执行Kernel.Inject以触发构造器设置器/初始化方法调用。重新调用堆栈,总是有一个 - 有时候,它只是提供了一个简单的方法来获取 – 2012-08-18 13:39:05

回答

1

通过在应用程序启动过程中注入对象,您应该可以在您的Web应用程序生命周期的早期将对象Inject注入对象。

注意,您将不得不使用Property Setter Injection优先于构造函数注入,因为可能无法让缓存提供程序提供程序让您控制实例创建。

this blog post by @Remo Gloor

+0

我已经通过创建一个CacheProviderDependencyCollection并用inject属性标记了这个方法来尝试你的方法。不幸的是,这意味着依赖集合现在成为公共接口的一部分,这是一个好的做法吗?注入是在Initialize方法被调用后发生的,这意味着我必须做第二个初始化方法,并检查我的cacheprovider是否已经在cacheprovider的add,set,get和remove方法中被实际初始化(连接到db)。如果您认为这是针对此特定问题的最佳解决方案,那么我会接受您的答案。 – 2012-08-18 18:04:33

+1

@ error_404不太了解'OutputCacheProvider'可以说(从来没有用过,甚至不能猜测它到达的FW版本);取决于它设计的时代。 Obv这样一个混乱的解决方法只是从你得到一个'IKernel'的一小步。底线是,任何涉及构造函数注入的解决方案(如果你想要的 - 你应该想 - 你的愿望是最合理的)将需要底层系统给你一种方法来控制创建。 – 2012-08-18 18:34:23

相关问题