Как сделать: Caliburn.Micro.Autofac и Windows Phone - PullRequest
1 голос
/ 06 декабря 2011

Есть ли пример, учебное пособие или что-нибудь, что показывает, как использовать Caliburn.Micro.Autofac с Windows Phone?

Я создал базовое приложение только с Caliburn.Micro, и оно работает нормально. Затем я решил использовать Caliburn.Micro.Autofac, поэтому я извлек свой Bootstrapper из Caliburn.Micro.Autofac.AutofacBootstrapper и вызвал base.Configure() внутри метода Bootstrapper Configure(). Теперь, когда я запустил приложение, я получаю «Тип AppBootstrapper не был найден». исключение.

Ценю любую помощь.

Ответы [ 2 ]

2 голосов
/ 20 декабря 2011

Это загрузчик, который я написал для проекта WP7. Он основан на Caliburn.Micro.Autofac.AutofacBootstrapper, но исправляет некоторые ошибки.

public class AppBootstrapper : PhoneBootstrapper
{
    private IContainer container;

    protected void ConfigureContainer(ContainerBuilder builder)
    {
        // put any custom bindings here
    }

    #region Standard Autofac/Caliburn.Micro Bootstrapper

    protected override void Configure()
    {
        //  configure container
        var builder = new ContainerBuilder();

        //  register phone services
        var caliburnAssembly = AssemblySource.Instance.Union(new[] { typeof(IStorageMechanism).Assembly }).ToArray();
        //  register IStorageMechanism implementors
        builder.RegisterAssemblyTypes(caliburnAssembly)
          .Where(type => typeof(IStorageMechanism).IsAssignableFrom(type)
                         && !type.IsAbstract
                         && !type.IsInterface)
          .As<IStorageMechanism>()
          .SingleInstance();

        //  register IStorageHandler implementors
        builder.RegisterAssemblyTypes(caliburnAssembly)
          .Where(type => typeof(IStorageHandler).IsAssignableFrom(type)
                         && !type.IsAbstract
                         && !type.IsInterface)
          .As<IStorageHandler>()
          .SingleInstance();

        // The constructor of these services must be called
        // to attach to the framework properly.
        var phoneService = new PhoneApplicationServiceAdapter(RootFrame);
        var navigationService = new FrameAdapter(RootFrame, false);

        builder.Register<IPhoneContainer>(c => new AutofacPhoneContainer(c)).SingleInstance();
        builder.RegisterInstance<INavigationService>(navigationService).SingleInstance();
        builder.RegisterInstance<IPhoneService>(phoneService).SingleInstance();
        builder.Register<IEventAggregator>(c => new EventAggregator()).SingleInstance();
        builder.Register<IWindowManager>(c => new WindowManager()).SingleInstance();
        builder.Register<IVibrateController>(c => new SystemVibrateController()).SingleInstance();
        builder.Register<ISoundEffectPlayer>(c => new XnaSoundEffectPlayer()).SingleInstance();
        builder.RegisterType<StorageCoordinator>().AsSelf().SingleInstance();
        builder.RegisterType<TaskController>().AsSelf().SingleInstance();

        //  allow derived classes to add to the container
        ConfigureContainer(builder);

        //  build the container
        container = builder.Build();

        //  start services
        container.Resolve<StorageCoordinator>().Start();
        container.Resolve<TaskController>().Start();

        //  add custom conventions for the phone
        AddCustomConventions();
    }

    protected override object GetInstance(Type service, string key)
    {
        object instance;
        if (string.IsNullOrEmpty(key))
        {
            if (container.TryResolve(service, out instance))
                return instance;
        }
        else
        {
            if (container.TryResolveNamed(key, service, out instance))
                return instance;
        }
        throw new Exception(string.Format("Could not locate any instances of contract {0}.", key ?? service.Name));
    }

    protected override IEnumerable<object> GetAllInstances(Type service)
    {
        return container.Resolve(typeof(IEnumerable<>).MakeGenericType(service)) as IEnumerable<object>;
    }

    protected override void BuildUp(object instance)
    {
        container.InjectProperties(instance);
    }

    private static void AddCustomConventions()
    {
        ConventionManager.AddElementConvention<Pivot>(Pivot.ItemsSourceProperty, "SelectedItem", "SelectionChanged").ApplyBinding =
            (viewModelType, path, property, element, convention) =>
            {
                if (ConventionManager
                    .GetElementConvention(typeof(ItemsControl))
                    .ApplyBinding(viewModelType, path, property, element, convention))
                {
                    ConventionManager
                        .ConfigureSelectedItem(element, Pivot.SelectedItemProperty, viewModelType, path);
                    ConventionManager
                        .ApplyHeaderTemplate(element, Pivot.HeaderTemplateProperty, viewModelType);
                    return true;
                }

                return false;
            };

        ConventionManager.AddElementConvention<Panorama>(Panorama.ItemsSourceProperty, "SelectedItem", "SelectionChanged").ApplyBinding =
            (viewModelType, path, property, element, convention) =>
            {
                if (ConventionManager
                    .GetElementConvention(typeof(ItemsControl))
                    .ApplyBinding(viewModelType, path, property, element, convention))
                {
                    ConventionManager
                        .ConfigureSelectedItem(element, Panorama.SelectedItemProperty, viewModelType, path);
                    ConventionManager
                        .ApplyHeaderTemplate(element, Panorama.HeaderTemplateProperty, viewModelType);
                    return true;
                }

                return false;
            };
    }

    #endregion
}

РЕДАКТИРОВАТЬ Я создал форк Caliburn.Micro.Autofac и исправил проблему на GitHub. Надеемся, что запрос на прием будет принят, и он станет частью основного хранилища.

На данный момент вы можете получить доступ к загрузчику и AutofacPhoneContainer отсюда - https://github.com/distantcam/Caliburn.Micro.Autofac/tree/master/src/Caliburn.Micro.Autofac-WP7

0 голосов
/ 04 июня 2012

Я реализовал правильную (на мой взгляд) версию Caliburn.Micro.Autofac для Windows Phone.Вы можете скачать его и протестировать проект из моего блога .Сообщение в блоге на русском языке, но вы найдете ссылку на ZIP-файл в верхней части сообщения.Код слишком велик для размещения здесь, поэтому, пожалуйста, возьмите его из блога.Я отправил это Дэвиду Буксбауму (автору Caliburn.Micro.Autofac).Надеюсь, он скоро включит его в свою кодовую базу.

ОБНОВЛЕНИЕ

Что исправлено:

  1. Компоненты, реализующие службы IPhoneService и INavigationService, должныбыть созданным перед регистрацией в контейнере.
  2. Реализован компонент, реализующий IPhoneContainer.Без этого вы не можете использовать Autofac в Caliburn.Micro.
...