Я использую 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();
...
