Autofac 拥有<>

问题描述 投票:0回答:2

我不太明白 Autofac 自有和非自有一次性组件之间的区别。

interface IMessageHandler
{
    void Handle(Message message);
}

class MessagePump
{
    Func<Owned<IMessageHandler>> _handlerFactory;

    public MessagePump(Func<Owned<IMessageHandler>> handlerFactory)
    {
        _handlerFactory = handlerFactory;
    }

    public void Go()
    {
        while (true)
        {
            var message = NextMessage();

            using (var handler = _handlerFactory())
            {
                handler.Value.Handle(message);
            }
        }
    }
}

上面的代码与下面的代码有什么区别:

class MessagePump
{
    IMessageHandler _handler;
    
    public MessagePump(IMessageHandler handler)
    {
        _handler = handler;
    }
    
    public void Go()
    {
        while (true)
        {
            var message = NextMessage();
    
            _handler.Handle(message);
        }
    }
}

都是我选择的时候手动处理的,那有什么区别呢?

c# dependency-injection autofac
2个回答
3
投票

区别在于,如果不使用 Owned,则不会为 T 及其依赖项创建嵌套的生命周期作用域。如果您手动处置实例,您将不会处置任何注册为

InstancePerLifetimeScope
的依赖项,因为它们现在与您的 MessagePump 位于相同的生命周期范围内。

例如,如果您的处理程序本身依赖于数据库资源,那么一般的想法是您希望它们与您的处理程序一起使用,而不是与我认为长期存在的消息泵一起使用。


2
投票

使用

Owned<T>
通知 Autofac 您不希望 Autofac 处理您的依赖项,因为您要自己处理。然后 - 您可以/应该使用
using
语句或直接在代码中调用
Dispose()
来处理依赖关系,
Dispose()
不会被自动调用。

当你不打算使用

Owned<T>
依赖项时,你不需要自己处理你的依赖项 - Autofac 会在必要时为你做这件事。您不必使用
using
语句,您不必记住依赖项是否是一次性的。

© www.soinside.com 2019 - 2024. All rights reserved.