2016-05-09 56 views
1

我是依賴注入的新手。我在理解如何使用nancyFx引導程序和TinyIoc時遇到問題。我想引用一個依賴關係,但不能忽略如何去做。我似乎無法在任何地方找到正確的信息或者我只是誤解it.This是我的代碼:NancyFx和TinyIoc

public class Startup1 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.UseNancy(); 
    } 
} 

我的界面:

public interface IPerson 
{ 
    string Getname(); 
} 

我的實現:

public class Person : IPerson 
{ 
    public string Name { get; set; } 
    public string Getname() 
    { 
     return Name; 
    } 
} 

我程序

static void Main(string[] args) 
    { 
     Person person = new Person(); 
     person.Name = "Bill"; 
     string uri = "http://localhost:8080/"; 
     using (WebApp.Start<Startup1>(uri)) 
     { 
      Console.WriteLine("Started"); 
      Console.ReadKey(); 
      Console.WriteLine("Stopping"); 
     } 

    } 

我南希引導程序:

public class MyNancyBoot : DefaultNancyBootstrapper 
{ 
    protected override void ConfigureApplicationContainer(TinyIoCContainer container) 
    { 
     //base.ConfigureApplicationContainer(container); 
      container.Register<IPerson>(new Person()); 

    } 
} 

我nancyModule:

public class MyNancyModule : NancyModule 
{ 
    public MyNancyModule(IPerson person) 
    { 
     Get["/"] = _ => 
     { 
      var x = TinyIoCContainer.Current.Resolve<IPerson>(); 
      return "OK"; 

     }; 
    } 
} 

這返回一個錯誤MyNancyModule。

var x = TinyIoCContainer.Current.Resolve<IPerson>(); 

好的,我該如何讓我的人進入MyNancyModule?

+0

你應該不需要做任何事情,南希應該會自動爲你提取這些依賴關係。 –

+0

可以確認我創建了一個虛擬應用程序,並且不需要手動連接接口。我已經添加了一個簡單的項目到我的GIT頁面https://github.com/OnamChilwan/NancyFx-Concept希望非常自我解釋。顯示一個實現了沒有自定義引導的接口使用默認的接口,南希自動檢測到這一點。 –

+0

好的,謝謝我想要一個自定義Bottstrapper的原因,因爲在我的其他項目中啓動nancy需要很長時間。 –

回答

0

我想引用一個依賴項,但不能忽略如何去做。

我認爲這裏有幾件事要看。

您錯誤地認爲您需要以某種方式傳遞控制器構造函數中您可能想要從Get [「/」]控制器操作返回的任何類型。不是這種情況。如果其中一個服務操作發生返回Person類型,則不需要將該人員類型注入到構造函數中。相反,你可能只是這樣做:

Get["/"] = _ => 
    { 
     var x = new List<Person>(); 
     return Response.AsJson(x); 
    }; 

顯然,這服務操作是非常有限的,因爲它總是會返回一個類型的人的一個空列表。

所以你需要的是一個依賴它得到人。例如:

interface IGetPersons 
{ 
    List<Person> GetAll(); 
} 

爲了在控制器內部使用它,Tiny Ioc需要了解它。所以這就是你可以用Tiny Ioc註冊這個類型的地方。

container.Register<IGetPersons>(); 

這將我們帶到了第二件事情上,那就是Tiny Ioc的工作方式。

在nancy引導程序中添加隱式註冊之後,Tiny Ioc將會掃描您的程序集並自動查找IGetPersons的實現! (這是假設有一個實現,如果不止一個實際需要做更多的工作,但這是另一個故事)。

這片神奇的則可以讓你只需要修改你的控制器這樣的:

public MyNancyModule(IGetPersons personGetter) 
{ 
    Get["/"] = _ => 
    { 
     var x = List<Person> personGetter.GetAll(); // Look, don't need to resolve this manually! 
     return Response.AsJson(x); 
    }; 
} 

微小國際奧委會將照顧解決注入類型的IGetPersons實現,你就可以自由通過控制器來使用。

比方說,一個客戶端發出一個HTTP POST到一個雙贏的形式應用程序,它是 運行南希服務。如何從南澳服務獲取數據到贏得表格。

看一看下面:http://weblogs.asp.net/rweigelt/10235654

筆者使用託管擴展框架(MEF)進行修改,我認爲什麼是某種單的框架提供:

container.Register(MefContainer.GetExportedValue<IRemoteAccess>()); 
+0

我不確定我們是否瞭解對方。讓我們說一個客戶發送一個http帖子給正在運行nancy服務的win表單應用程序。如何從nancy服務獲取數據到勝出表格。 –

+0

@PaulStanley - 這實際上是一個完全不同的問題,你問上面的問題。我想你應該爲此創建一個新問題。 –

+0

在回答你的問題時,我不知道如何直接調用主機容器,而不是通過操縱某些類型的靜態資源(內存或文件等)來訪問它們。 –