簡體   English   中英

NancyFx和TinyIoc

[英]NancyFx and TinyIoc

我是依賴注入的新手。我在理解如何使用nancyFx bootstrapper和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");
        }

    }

我的nancy bootstrapper:

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?

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

我想在這里有幾件事要看。

您錯誤地認為您需要以某種方式在控制器構造函數中傳入您可能希望從Get [“/”]控制器操作返回的任何類型。 不是這種情況。 如果其中一個服務操作碰巧返回Person類型,則不需要將該類型注入構造函數中。 相反,你可以做類似的事情:

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

顯然,這種服務操作的用途非常有限,因為它總是返回一個Person類型的空列表。

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

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

為了在控制器內部使用它,Tiny Ioc將需要了解它。 那么你可以在那里用Tiny Ioc注冊這個類型。

container.Register<IGetPersons>(); 

這將我們帶到你正在努力的第二件事,這就是Tiny Ioc的工作方式。

在nancy bootstrapper中添加隱式注冊后,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);
    };
}

Tiny Ioc將負責將注入類型解析為IGetPersons實現,然后您可以通過控制器自由使用。

讓我們說一個客戶端發送一個http發布到一個運行南希服務的win表單應用程序。 如何從nancy服務獲取數據到win表單。

看看以下內容: http//weblogs.asp.net/rweigelt/10235654

作者使用Managed Extensibility Framework(MEF)來改變我認為是框架提供的某種單例:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM