Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.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# 创建Unity容器是否应该被认为是一项昂贵的操作,因为它涉及到资源和时间?_C#_.net_Unity Container - Fatal编程技术网

C# 创建Unity容器是否应该被认为是一项昂贵的操作,因为它涉及到资源和时间?

C# 创建Unity容器是否应该被认为是一项昂贵的操作,因为它涉及到资源和时间?,c#,.net,unity-container,C#,.net,Unity Container,我最近开始在.net中使用Unity进行依赖注入。 我的印象是Unity容器很可能是类的单例或静态成员。我看到另一个开发人员在请求处理程序中使用它,它将接收大量流量 每次创建一个新的Unity容器的成本都很低,是有什么神奇的事情发生了吗?还是应该重新考虑这段代码,只创建一次Unity容器 此代码是.svc服务实现类的一部分 public string DoSomeWork(Request request) { var container = new UnityContainer().Loa

我最近开始在.net中使用Unity进行依赖注入。 我的印象是Unity容器很可能是类的单例或静态成员。我看到另一个开发人员在请求处理程序中使用它,它将接收大量流量

每次创建一个新的Unity容器的成本都很低,是有什么神奇的事情发生了吗?还是应该重新考虑这段代码,只创建一次Unity容器

此代码是.svc服务实现类的一部分

public string DoSomeWork(Request request)
{
   var container = new UnityContainer().LoadConfiguration("MyContainer");
   var handler = container.Resolve<RequestHandler>();
   return handler.Handle(request);
}
公共字符串DoSomeWork(请求)
{
var container=new UnityContainer().LoadConfiguration(“MyContainer”);
var handler=container.Resolve();
返回处理程序.Handle(请求);
}

对于Unity不是100%确定,但是对于大多数IoC容器,容器的创建,尤其是容器配置的加载是一个相当昂贵的操作


我不得不质疑为什么这个开发人员会以这种方式使用容器。理想情况下,IoC容器甚至不应该是静态或单例对象——它应该被实例化,只用于解析依赖关系树的顶级对象,应用程序中的其余对象应该通过依赖关系注入自动构造。在您的示例中,理想情况下,包含该方法的类将通过构造函数将RequestHandler(理想情况下是该方法的接口)注入其中,这样类就不需要知道IoC容器。

对于Unity不是100%确定,但是对于大多数IoC容器,创建容器,尤其是装载容器配置是一项相当昂贵的操作


我不得不质疑为什么这个开发人员会以这种方式使用容器。理想情况下,IoC容器甚至不应该是静态或单例对象——它应该被实例化,只用于解析依赖关系树的顶级对象,应用程序中的其余对象应该通过依赖关系注入自动构造。在您的示例中,理想情况下,包含该方法的类将通过构造函数将RequestHandler(理想情况下是该方法的接口)注入其中,这样类就不需要了解IoC容器。

这不是使用IoC容器的正确方法-基本上您将其用作,但这将导致对IOC容器的依赖关系散布在整个代码库中

您应该做的是在代码库中有一个中心点,所有依赖项都在这里解析,然后使用依赖项注入(DI)将解析的具体类沿着链传播,即通过构造函数注入。所以你的班级应该是这样的:

public class Foo
{
    private readonly IRequestHandler _handler;

    public Foo(IRequestHandler handler)
    {
        _handler = handler;
    }

    public string DoSomeWork(Request request)
    {
        return _handler.Handle(request);
    }
}

这不是使用IOC容器的正确方法-基本上您是将其用作一个容器,但这将导致对IOC容器的依赖关系散布在整个代码库中

您应该做的是在代码库中有一个中心点,所有依赖项都在这里解析,然后使用依赖项注入(DI)将解析的具体类沿着链传播,即通过构造函数注入。所以你的班级应该是这样的:

public class Foo
{
    private readonly IRequestHandler _handler;

    public Foo(IRequestHandler handler)
    {
        _handler = handler;
    }

    public string DoSomeWork(Request request)
    {
        return _handler.Handle(request);
    }
}

通常在合成根目录下创建DI容器。不是因为这很昂贵,而是因为它在Grandi方案中是有意义的。在组合根目录之外进行绑定通常会导致糟糕的设计。我应该澄清一下,这段代码用于实现服务(.svc文件)。我不知道Unity可以直接用作.svc的一部分。您通常在合成根目录下创建DI容器。不是因为这很昂贵,而是因为它在Grandi方案中是有意义的。在组合根目录之外进行绑定通常会导致糟糕的设计。我应该澄清一下,这段代码用于实现服务(.svc文件)。我不知道Unity是否可以直接用作.svc的一部分。我应该澄清一下,这段代码是用来实现服务(.svc文件)的。我不知道Unity是否可以直接用作.svc的一部分。我应该澄清一下,这段代码是用来实现服务(.svc文件)的。我不知道Unity是否可以直接用作.svc的一部分。我应该澄清一下,这段代码是用来实现服务(.svc文件)的。我不知道Unity是否可以直接用作.svc的一部分。我应该澄清一下,这段代码是用来实现服务(.svc文件)的。我不知道Unity是否可以直接用作.svc的一部分。