Должен ли я заставить Autofac включать классы, у которых нет общедоступного конструктора?

У меня есть Asp.Net API (.NET Framework 4.7.2). Недавно мы обновили Autofac до версии 6.2.0. Autofac не любит некоторые из наших классов, у которых нет общедоступного конструктора.

Пример класса:

public sealed class User
{   
    private static readonly Lazy<User> Lazy = new Lazy<User>(() => new User());

    public static User Instance => Lazy.Value;

    private User()
    {
    }

    public DateTime UserDate { get; set; }
    public string UserId { get; set; }
    public string UserName { get; set; }
    public string Theme { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public bool IsLoggedIn { get; set; }

    public PrismApplication LoggedInTo {get;set;}
}

Я постарался исключить эти классы для Autofac ContainerBuilder в Global.asax.cs:

        ...
        var builder = new ContainerBuilder();
        builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

        var targetAssembly = typeof(SalesDocumentCommandHandler).GetTypeInfo().Assembly;

        var _skippedTypes = new HashSet<Type>();
        _skippedTypes.Add(typeof(User));
        _skippedTypes.Add(typeof(ReportClass));
        _skippedTypes.Add(typeof(PrismApplication));
        _skippedTypes.Add(typeof(OutboundEmailType));
        _skippedTypes.Add(typeof(OEDataset.OERow));
        _skippedTypes.Add(typeof(OEDataset.OESOPUserDefinedRow));
        _skippedTypes.Add(typeof(OEDataset.OESOPPOLinkRow));
        _skippedTypes.Add(typeof(OEDataset.OELineCommentRow));
        _skippedTypes.Add(typeof(OEDataset.OEHeaderCommentRow));
        _skippedTypes.Add(typeof(OEDataset.SOPTaxBreakupRow));
        _skippedTypes.Add(typeof(OEDataset.OEHDetailRow));
        _skippedTypes.Add(typeof(OEDataset.OEHHeaderRow));
        _skippedTypes.Add(typeof(OEDataset.OEDetailRow));
        _skippedTypes.Add(typeof(OEDataset.OEHeaderRow));

        builder.RegisterAssemblyTypes(targetAssembly).Where(x => !_skippedTypes.Contains(x))
            .As(type => type.GetInterfaces()
                .Where(interfacetype => interfacetype.IsAssignableFrom(typeof(ICommandHandler<>))
                                        || interfacetype.IsAssignableFrom(typeof(IEventHandler<>))))
            .AsSelf()
            .InstancePerDependency();

        targetAssembly = typeof(SalesDocumentCreatedEvent).GetTypeInfo().Assembly;

        builder.RegisterAssemblyTypes(targetAssembly).Where(x => !_skippedTypes.Contains(x))
            .As(type => type.GetInterfaces()
                .Where(interfacetype => interfacetype.IsAssignableFrom(typeof(ICommandHandler<>))
                                        || interfacetype.IsAssignableFrom(typeof(IEventHandler<>))))
            .AsSelf()
            .InstancePerDependency().PublicOnly();
        ...

Нет лучшего способа?

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *