gpt4 book ai didi

inversion-of-control - 在 Nancy 项目中获取 TinyIoc 当前容器

转载 作者:行者123 更新时间:2023-12-04 08:45:25 26 4
gpt4 key购买 nike

我正在构建一个小型 Nancy Web 项目。

在我的一个类(不是 nancy 模块)的方法中,我想基本上做:

var myThing = TinyIoC.TinyIoCContainer.Current.Resolve<IMyThing>();

但是, .Current 中只有一个注册。 (非公共(public)成员,_RegisteredTypes),即:
TinyIoC.TinyIoCContainer.TypeRegistration

自然,在我上面的代码中,我得到:

Unable to resolve type: My.Namespace.IMyThing



所以,我想我没有在我的 Bootstrap 中注册相同的容器?

有没有办法解决它?

编辑

为了充实我正在尝试做的事情:

基本上,我的 url 结构看起来像:

/{myType}/{myMethod}



因此,想法是:/customer/ShowAllWithTheNameAlex 将加载 Customer服务,并执行 showAllWithTheNameAlex方法

我的做法是:
public interface IService
{
void DoSomething();
IEnumerable<string> GetSomeThings();
}

然后我有一个抽象基类,带有一个返回服务的方法 GetService。
我在这里尝试使用 TinyIoC.TinyIoCContainer.Current.Resolve();
在这种情况下,它将是 TinyIoC.TinyIoCContainer.Current.Resolve("typeName");
public abstract class Service : IService
{
abstract void DoSomething();
abstract IEnumerable<string> GetSomeThings();

public static IService GetService(string type)
{
//currently, i'm doing this with reflection....
}
}

这是我的服务实现。
public class CustomerService : Service
{
public void DoSomething()
{
//do stuff
}

public IEnumerable<string> GetSomeThings()
{
//return stuff
}

public IEnumerable<Customer> ShowAllWithTheNameAlex()
{
//return
}
}

最后,我有我的 Nancy 模块,它看起来像:
public class MyModule : NancyModule
{
public MyModule()
{
Get["/{typeName}/{methodName}"] = p => ExecuteMethod(p.typeName, p.methodName);
}

private dynamic ExecuteMethod(string typeName, string methodName)
{
var service = Service.GetService(typeName);

var result = service.GetType().GetMethod(methodName).Invoke(service, null);

//do stuff

return result; //or whatever
}
}

最佳答案

@alexjamesbrown - 简短的回答是,你没有。 Nancy 是专门设计的,因此您无需直接处理容器。您提到要依赖 IMyThing 的类, 不是 NancyModule。好吧,这不是问题,只要您的一个模块引用了它,那么这些依赖项也可以有自己的依赖项,这些依赖项将在运行时得到满足。

public interface IGreetingMessageService
{
string GetMessage();
}

public class GreetingMessageService: IGreetingMessageService
{
public string GetMessage()
{
return "Hi!";
}
}

public interface IGreeter
{
string Greet();
}

public class Greeter
{
private readonly IGreetingMessageService service;

public Greeter(IGreetingMessageService service)
{
this.service = service;
}

public string Greet()
{
return this.service.GetMessage();
}
}

public class GreetingsModule : NancyModule
{
public GreetingModule(IGreeter greeter)
{
Get["/"] = x => greeter.Greet();
}
}

以上将正常工作, Greeter将依赖 IGreetingMessageService运行时满足

关于inversion-of-control - 在 Nancy 项目中获取 TinyIoc 当前容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12606195/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com