Использование Autofac со статическим классом сервисов

Я использую Autofac, чтобы максимизировать совместное использование кода между Android и iOS через общую сборку PCL в среде Xamarin (родной). Уровень общих служб состоит из четырех интерфейсов к классам, содержащим методы или данные, которые не меняются на протяжении всего жизненного цикла приложения.

Вместо того, чтобы разрешать классы служб из одноэлементного контейнера Autofac в каждой точке использования, я подумал о создании класса статических ссылок на службы.

Я хотел бы знать, есть ли что-то по существу неправильное в этом подходе (например, утечки памяти), и есть ли какие-то лучшие предложения, которые кто-то мог бы сделать.

В этом суть:

Android (и эквивалентная iOS):

public class BootStrap
{
    private static IContainer container = null;
    public static IContainer Container()
    {
        if (container == null)
        {
            ContainerBuilder builder = new ContainerBuilder();
            builder.RegisterType<CacheFactory>().SingleInstance().As<ICacheFactory>(); ;
            builder.RegisterType<ClientFactory>().SingleInstance().As<IClientFactory>();
            builder.RegisterType<CoreHelpers>().SingleInstance().As<ICoreHelpers>();
            builder.RegisterType<PrefsSerializer>().SingleInstance().As<IPrefsSerializer>();
            builder.RegisterType<Services>().SingleInstance();
            container = builder.Build();
        }
        return container;
    }
}

public class MainApp
{
    private ILifetimeScope RootScope;

    public MainApp
    {
        RootScope = BootStrap.Container().BeginLifetimeScope();         // register types, return container
        RootScope.Resolve<Services>();                                  // set static Services members
    }

    ~MainApp()
    {
        RootScope.Dispose();
    }
}

Общая сборка:

public class Services
{
    public static ICacheFactory CacheFactory;       // data and methods
    public static IClientFactory ClientFactory;     // data and methods
    public static ICoreHelpers CoreHelpers;         // methods only
    public static IPrefsSerializer PrefsHelper;     // methods only

    public Services(ICacheFactory _cacheFactory, IClientFactory _clientFactory, ICoreHelpers _coreHelpers, IPrefsSerializer _prefsHelper)
    {
        CacheFactory = _cacheFactory;
        ClientFactory = _clientFactory;
        CoreHelpers = _coreHelpers;
        PrefsHelper = _prefsHelper;
    }
}

Использование:

Services.CacheFactory.GetCache().DoSomething();
UserClient user = Services.ClientFactory.GetUserClient();
... 

0

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

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