2016-05-09 32 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

在回答你的问题时,我不知道如何直接调用主机容器,而不是通过操纵某些类型的静态资源(内存或文件等)来访问它们。 –