2011-11-09 71 views
1

刪除默認流水線貢獻者(OpenRasta 2.0.3)的首選方式是什麼?刪除默認流水線貢獻者

我沒有在網上找到上很多,但一個方法似乎是編寫自定義DependencyRegistrar,即從DefaultDependencyRegistrar推導,然後如覆蓋AddDefaultContributors()。除此之外,我懷疑這是刪除單個管道貢獻者的最好方法,似乎需要額外的每個主機(ASP與InMemory)工作,而我認爲將管道處理程序搞亂是與主機無關的事情。

但是,即使我走這條路,這傢伙在這裏似乎已經嘗試過沒有成功:http://groups.google.com/group/openrasta/browse_thread/thread/d72b91e5994f402b 我試過類似的事情,但至今不能讓我的自定義登記處替換默認。

那麼刪除默認管道貢獻者最簡單和最好的方法是什麼,最好是以主機不可知的方式?有什麼地方有個例子嗎?

回答

1

沒有,你只需要來自注冊以獲得和使用受保護的成員,可用於去除勢在必行你不想自動註冊的類型。

註冊商需要在容器中進行註冊,你把它提供給OpenRasta之前,否則型已經被解決。

+0

一個示例會有幫助。我已經嘗試了http://trac.caffeine-it.com/openrasta/wiki/Doc/DependencyInjection/Ninject中描述的內容,其中給出了一些示例,用於爲AspNetHost設置一個自定義IDependencyResolverAccessor(爲InternalDependencyResolver添加一個自定義註冊器)和HttpListenerHost。但是,這似乎不適用於具有IDependencyResolverAccessor硬編碼(它直接實現它)的InMemoryHost。 –

+0

P.S.如果我複製InMemoryHost並將其修改爲我的需要,則很容易將缺省管道參與者刪除。不過,我想知道爲什麼刪除處理程序必須以特定於主機的方式實現,此時處理程序的添加與主機無關。 –

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>(); 
... 
+0

OpenWrap 2不是設計用來開箱即用的內部IoC容器,而是用於儘快使用外部容器,因爲這是您的代碼,因此每個宿主環境都必須完成此操作並不是一個大問題。人們最終主要使用內部IoC,因此我們將重新訪問該API。 – SerialSeb

+0

不用擔心。這是合理的,只是想確保我不會錯過一些更好的方式來做到這一點。 –