我知道这个标题还有其他问题。但我觉得我的情况有所不同。
我正在尝试创建一个使用其他项目服务的控制台应用程序。 我安装了Unity用于依赖注入。这是代码
class Program
{
private readonly IFooService _service;
public Program(IFooService service)
{
_service = service;
}
static void Main(string[] args)
{
var unity = new UnityContainer();
var unityConfig = new MyUnityConfig();
unityConfig.RegisterTypes(unity);
// need to call MyFunc
}
public void MyFunc()
{
Console.WriteLine("Hello world!");
_service.ServiceFunc();
}
}
这里是MyUnityConfig
类
public class MyUnityConfig
{
public void RegisterTypes(IUnityContainer container)
{
//repository registration
container.RegisterType<IFooRepository, FooRepository>();
//services registration
container.RegisterType<IFooService, FooService>();
}
}
我无法拨打MyFunc
,因为不是静态的。如果我MyFunc
静态,我无法使用_service
,因为_service
不是静态的。我可以创建新的程序对象并创建实现IFooService的FooService
对象,但是我必须创建需要在FooService的构造函数中传递的FooRepository的新对象,并且依赖的整个想法没有意义。
最后我无法使Main非静态因为那样我会得到Program does not static 'Main' method for entry point
错误
Ps:如果我的问题与标题不符,请随意更改问题标题。如果我的做法错了,请纠正我。
答案 0 :(得分:2)
当您使用DI容器时 - 涉及容器类型的所有实例化(例如IFooService
)都应该通过容器。
在您的情况下,Program
取决于IFooService
,因此也应在容器中注册:
public void RegisterTypes(IUnityContainer container)
{
//repository registration
container.RegisterType<IFooRepository, FooRepository>();
//services registration
container.RegisterType<IFooService, FooService>();
container.RegisterType<Program>();
}
然后从容器中解析(它也将解析所有依赖项,例如IFooService
):
var unity = new UnityContainer();
var unityConfig = new MyUnityConfig();
unityConfig.RegisterTypes(unity);
var p = (Program)unity.GetService(typeof(Program));
p.MyFunc();