Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 控制台应用程序中的Autofac(约定)_C#_.net_Dependency Injection_Console Application_Autofac - Fatal编程技术网

C# 控制台应用程序中的Autofac(约定)

C# 控制台应用程序中的Autofac(约定),c#,.net,dependency-injection,console-application,autofac,C#,.net,Dependency Injection,Console Application,Autofac,我想在控制台应用程序中使用Autofac。这是我第一次使用。在此之前,我只在ASP.NETMVC中使用它。在MVC项目中,我可以在Global.asax中设置Autofac,将iSeries设备注入控制器,我们可以说它可以或多或少地工作。 在控制台应用程序中,我执行以下操作: internal class Program { private static IContainer Container { get; set;} private static void Main(str

我想在控制台应用程序中使用Autofac。这是我第一次使用。在此之前,我只在ASP.NETMVC中使用它。在MVC项目中,我可以在Global.asax中设置Autofac,将iSeries设备注入控制器,我们可以说它可以或多或少地工作。 在控制台应用程序中,我执行以下操作:

internal class Program
{
    private static IContainer Container { get; set;}

    private static void Main(string[] args)
    {
         Container = Container.Configure(); // here I have all necessary objects set
         // now I can use it in Main method as:
         using (var scope = Container.BeginLifetimeScope())
         {
             scope.Resolve<ISomething>();
         }
    }
}
或者我应该在Cat类中创建IContainer


最好的解决方案是什么?

只有您的控制台应用程序真正需要了解AutoFac,否则您就会陷入服务定位器模式,这通常被认为是一种反模式。相反,应用程序应遵循以下模式:

//in your console application
using (var scope = Container.BeginLifetimeScope())
{
    IServiceservice = scope.Resolve<IService>();
    service.Execute();
}

class SomeService : IService
{
    readonly ISomeDependency _dependency;

    public SomeService(ISomeDependency dependency)
    {
        _dependency = dependency;
    }

    public void Execute()
    {
        _dependency.DoSomething();
    }
}

interface IService
{
    void Execute();
}
//在控制台应用程序中
使用(var scope=Container.BeginLifetimeScope())
{
IServiceservice=scope.Resolve();
service.Execute();
}
服务类别:IService
{
readonly ISomeDependency\u dependency;
公共服务(等距依赖)
{
_依赖=依赖;
}
public void Execute()
{
_dependency.DoSomething();
}
}
接口设备
{
void Execute();
}
请注意,我实际上从未调用构造函数。我养成了一个习惯,永远不要“新建”对象,除非该对象只是一个POCO(只包含数据,不包含逻辑)


请注意,
ISomeDependency
本身可以依赖于0个或多个其他类,这是通过构造函数注入实现的。由于AutoFac创建了
iSeries设备
,及其所有依赖项,包括
ISomeDependency
,所有
ISomeDependency
的依赖项也将被初始化,以此类推。Miguel Castro的视频很好地展示了这一概念。

我使用autofac dependency injection configure创建了这个dotnet core console应用程序模板,这将为每次设置新项目时的重复工作节省宝贵时间。通过nuget安装,希望它能为您提供良好的服务


梅森,谢谢你宝贵的回答。我想把我的问题从第一篇文章扩展到第二篇。正如您所写的,我们可以在main方法中创建任何对象。如果我想在其他课程中使用Autofac,该怎么办?假设我有一个类
公共类EmployeeService{public Employee GetEmployee(decimal id){//在这里我想使用一些其他服务:使用AutoFac注入//我应该在这里再次创建Container对象,然后://使用(var scope=Container.BeginLifetimeScope()){…}
@cube我不明白你现在在问什么。是的,你可以通过AutoFac创建一个对象的实例,并通过构造函数注入注入东西。我对我的理解感到困惑。但是你回答了我的疑问。再次感谢你。
//in your console application
using (var scope = Container.BeginLifetimeScope())
{
    IServiceservice = scope.Resolve<IService>();
    service.Execute();
}

class SomeService : IService
{
    readonly ISomeDependency _dependency;

    public SomeService(ISomeDependency dependency)
    {
        _dependency = dependency;
    }

    public void Execute()
    {
        _dependency.DoSomething();
    }
}

interface IService
{
    void Execute();
}