删除默认管道贡献者

时间:2011-11-09 05:38:56

标签: openrasta

删除默认管道贡献者(OpenRasta 2.0.3)的首选方法是什么?

我在网上没有找到很多内容,但是一种方法似乎是编写自定义DependencyRegistrar,即从DefaultDependencyRegistrar派生,然后例如覆盖AddDefaultContributors()。除此之外,我怀疑它是删除单个管道贡献者的最佳方式,它似乎需要额外的每主机(ASP与InMemory)工作,而我会考虑搞乱管道处理程序是与主机无关的事情。

但是,即使我走这条路,这个家伙似乎也尝试过没有成功:http://groups.google.com/group/openrasta/browse_thread/thread/d72b91e5994f402b 我尝试过类似的东西,但到目前为止还无法让我的自定义注册商替换默认值。

那么删除默认管道贡献者的最简单和最好的方法是什么,最好以主机不可知的方式?某处有一个有效的例子吗?

2 个答案:

答案 0 :(得分:1)

不,您只需要从注册商处获取并使用可用的受保护成员来强制删除您不希望自动注册的类型。

在您向OpenRasta提供之前,注册商需要在您的容器中注册,否则该类型已经解决。

答案 1 :(得分:1)

回答自己的工作代码片段,因为它们可能对其他人有帮助。

因此看起来无法删除默认管道贡献者 以宿主不可知的方式(虽然我不明白为什么OpenRasta不能 修改,以便将来轻松删除处理程序。)

需要编写的2个类实际上独立于 使用的主机:

public class MyDependencyRegistrar : DefaultDependencyRegistrar
{
    protected override void AddDefaultContributors()
    {
        base.AddDefaultContributors();
        PipelineContributorTypes.Remove(typeof(HandlerResolverContributor));
        // If we remove the only contributor for the 'well-known'
        // IHandlerSelection stage, like done above, we need to add
        // another one implements IHandlerSelection, otherwise
        // we'll run into errors (and what's the point of a pipeline
        // without a handler selector anyway?). So let's do that here:
        AddPipelineContributor<MyOwnHandlerResolverContributor>();
    }
}

为了使注册商可用,我们需要创建一个访问者 如下所示,然后需要在各种主机中设置:

public class MyDependencyResolverAccessor : IDependencyResolverAccessor
{
    InternalDependencyResolver resolver;

    public IDependencyResolver Resolver
    {
        get
        {
            if (resolver == null)
            {
                resolver = new InternalDependencyResolver();
                resolver.AddDependency<IDependencyRegistrar, MyDependencyRegistrar>();
            }
            return resolver;
        }
    }
}

对于Asp.Net,这似乎对我有用:

public class Global : System.Web.HttpApplication
{
    void Application_Start(object sender, EventArgs e)
    {
        OpenRastaModule.Host.DependencyResolverAccessor =
            new MyDependencyResolverAccessor();

对于InMemoryHost,我用它来进行集成测试和进程内访问 我的处理程序,我还没有找到一种方法来复制整个班级 InMemoryHost并根据我的需要修改它。事实上,我们不需要 在这种情况下,MyDependencyResolverAccessor作为InMemoryHost实现 IDependencyResolverAccessor已经。所以这就是它的样子。只有 最后一行实际上已添加到InMemoryHost的现有代码中:

public class TwinMemoryHost : IHost, IDependencyResolverAccessor, IDisposable
{
    readonly IConfigurationSource _configuration;
    bool _isDisposed;

    public TwinMemoryHost(IConfigurationSource configuration)
    {
        _configuration = configuration;
        Resolver = new InternalDependencyResolver();
        Resolver.AddDependency<IDependencyRegistrar, MyDependencyRegistrar>();
...