从控制台应用程序中的静态方法调用非静态方法

时间:2018-03-23 08:43:26

标签: c# dependency-injection static console-application

我知道这个标题还有其他问题。但我觉得我的情况有所不同。

我正在尝试创建一个使用其他项目服务的控制台应用程序。 我安装了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:如果我的问题与标题不符,请随意更改问题标题。如果我的做法错了,请纠正我。

1 个答案:

答案 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();