Autofac工厂采用静态方法

本文关键字:静态方法 工厂 Autofac | 更新日期: 2023-09-27 17:58:45

我的应用程序中有一个组件,其接口如下:

interface ILogger : IService
{
    Task LogAsync(Message message);
}

我需要使用静态方法构建这些实例:

ILogger logger = ServiceProxy.Create<ILogger>(new Uri(...), new ServicePartitionKey(...));

这对我的单元测试来说是有问题的,所以我正在用Autofac:与一个委托工厂进行实例化

public class LogConsumer
{
    private Func<Uri, ServicePartitionKey, ILogger> _logFactory;
    public LogConsumer(Func<Uri, ServicePartitionKey, ILogger> logFactory)
    {
        _logFactory = logFactory;
    }
    public async Task MethodThatUsesLogger()
    {
        ILogger logger = _logFactory(new Uri(...), new ServicePartitionKey(...));
        await logger.LogAsync(...);           
    }
}

我正在Autofac注册,如下所示:

builder.Register<ILogger>(ctx => (uri, key) => ServiceProxy.Create<ILogger>(uri, key));
  • 如果我需要以相同的方式注册10个不同的接口,我可以用泛型在一行中完成吗
  • 有没有一种方法可以在不注入Func的情况下做到这一点,并且更像Ninject.Extensions.Factory

Autofac工厂采用静态方法

通过实现IRegistrationSource ,您可以随心所欲

class FactoryRegistrationSource<TService> : IRegistrationSource
{
    public Boolean IsAdapterForIndividualComponents
    {
        get
        {
            return false;
        }
    }
    public IEnumerable<IComponentRegistration> RegistrationsFor(Service service, Func<Service, IEnumerable<IComponentRegistration>> registrationAccessor)
    {
        IServiceWithType typedService = service as IServiceWithType;
        if (typedService == null)
        {
            yield break;
        }
        if (typedService.ServiceType == typeof(TService))
        {
            IComponentRegistration registration = RegistrationBuilder.ForDelegate<Func<Uri, TService>>((c, p) => ((Uri uri) => Factory.Get<TService>(uri)))
                                                                     .CreateRegistration();
            yield return registration;
        }
    }
}

你必须这样注册:

builder.RegisterSource(new FactoryRegistrationSource<ILogger>());