NancyFx和TinyIoc

时间:2016-05-09 07:29:40

标签: c# rest nancy

我是依赖注入的新手。我在理解如何使用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?

1 个答案:

答案 0 :(得分:0)

  

我想引用一个依赖项,但不能理解如何去做。

我认为这里有几点需要注意。

您错误地认为您需要以某种方式在控制器构造函数中传入您可能希望从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服务获取数据   胜利形式。

请查看以下内容:http://weblogs.asp.net/rweigelt/10235654

作者正在使用Managed Extensibility Framework(MEF)来改变我认为是框架提供的某种单例:

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