2015-06-16 85 views
0

我正在使用F#重新編寫C#ASP.NET Web API應用程序。我已經完成了模型和控制器,並且移至執行IDependencyResolverMyDependencyResolverF#Web API中的IDependencyResolver接口實現

我有實施GetService方法,其簽名在C#是一個問題:

object GetService(System.Type serviceType) 

所以我需要返回一個obj並採取System.Type作爲參數。

這是我迄今爲止在F#:

type MyDependencyResolver() = 
    interface System.Web.Http.Dependencies.IDependencyResolver with 
     member this.BeginScope() : IDependencyScope = 
      this :> IDependencyScope 

     member this.GetService(serviceType:Type) : obj = 

      if (serviceType = typeof<Controllers.HomeController>) then 
       let homeController = new Controllers.HomeController(arg1, arg2, arg3, arg4) 
       homeController :> obj 
      // ??? 
      elif (serviceType = typeof<_>) then 
       null   

     member this.GetServices (serviceType: Type) :IEnumerable<obj> = 
      let x = new List<obj>() 
      x :> IEnumerable<obj> 

     member this.Dispose() = 
      () 

所以,如果serviceTypeHomeController型我想返回的HomeController一個實例,如果它是任何其他類型的我想返回null。我如何在F#中做到這一點?

編輯:

GetService方法在C#:

public object GetService(Type serviceType) 
{ 
    if (serviceType == typeof(Controllers.HomeController)){ 
     return new Controllers.HomeController(arg1, arg2, arg3, arg4); 
    } 
    return null; 
} 
+1

你是如何在C#實現中處理這個問題的? –

+2

除非你這樣做是爲了學習F#的某種自虐行爲,否則你應該知道兩件事情:** 1。**有很多可以完成這項工作的DI容器,等等。 ** 2。** [不要使用'IDependencyResolver'用於Web API;改用'IHttpControllerActivator'](http://blog.ploeh.dk/2012/09/28/DependencyInjectionandLifetimeManagementwithASP.NETWebAPI)。從F#開始也很容易。 –

+0

@SvenGrosen請參閱編輯 – Marta

回答

1

你可以只使用Activator.CreateInstance(serviceType)但你從哪裏得到的構造函數的參數?

在我的項目我使用Unity,其配置如下:

let private ConfigureUnity (config : HttpConfiguration) = 
     let rec unityResolver (container : IUnityContainer) = 
      { new IDependencyResolver with 
       member this.BeginScope() = 
        unityResolver(container.CreateChildContainer()) :> IDependencyScope 
       member this.GetService serviceType = 
        try container.Resolve(serviceType) with 
         | :? ResolutionFailedException -> null 
       member this.GetServices serviceType = 
        try container.ResolveAll(serviceType) with 
         | :? ResolutionFailedException -> Seq.empty 
       member this.Dispose() = container.Dispose() 
      } 

     config.DependencyResolver <- (new UnityContainer()) 
      .RegisterType<IFoo, FooImplementation>(new HierarchicalLifetimeManager()) 
      .RegisterType<IBar, BarImplementation>(new HierarchicalLifetimeManager()) 
      |> unityResolver 

類(如您的控制器),然後自動解析和Unity將爲您創建依賴(構造函數的參數)。使用其他依賴注入框架應該很簡單。

+0

是'IFoo'和'FooImplementation'相當於' arg1'在我的代碼示例中? (在我的代碼示例中,我從同一個模塊獲取構造函數參數,它們是'ILogger'等) – Marta

+0

是的,構建對象圖時,這些由DI框架(此處爲Unity)使用。可能是,一些論據本身就有依賴關係,然後也解決了。 – CaringDev