簡體   English   中英

Autofac工廠用於靜態方法

[英]Autofac factory for a static method

我的應用程序中有一個組件,其界面如下所示:

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?

您可以通過實施IRegistrationSource來執行您想要的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>());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM