回答我自己的工作代碼片段,因爲它們可能對別人有幫助。
所以看起來除去默認管道提供者不能做在一臺主機無關的方式 (雖然我不明白爲什麼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>();
...
一個示例會有幫助。我已經嘗試了http://trac.caffeine-it.com/openrasta/wiki/Doc/DependencyInjection/Ninject中描述的內容,其中給出了一些示例,用於爲AspNetHost設置一個自定義IDependencyResolverAccessor(爲InternalDependencyResolver添加一個自定義註冊器)和HttpListenerHost。但是,這似乎不適用於具有IDependencyResolverAccessor硬編碼(它直接實現它)的InMemoryHost。 –
P.S.如果我複製InMemoryHost並將其修改爲我的需要,則很容易將缺省管道參與者刪除。不過,我想知道爲什麼刪除處理程序必須以特定於主機的方式實現,此時處理程序的添加與主機無關。 –