saifi
saifi

Reputation: 35

Prism 8 support for Autofac

We have a big project that uses Autofac. We also use Prism EventAggregator and DelegateCommand within this project. We need to use regions and modules in this project. I read, unleass I miss understood, that prism no longer supports Autofac. Would anyone be kind enough, and inform me if Prism 8 supports a way to use Autofac or it will stuck with Unity and DryIOC?

Thanks in advance? Saifi

Upvotes: 2

Views: 1563

Answers (2)

ws_
ws_

Reputation: 1246

Prism 8 does not support autofac officially, you can only use autofac untill prism 7.

Prism offers an instruction about how to add custom container:
https://prismlibrary.com/docs/dependency-injection/add-custom-container.html

The container shouldn't be imutable to work with prism. The new version of autofac does not meet its requirements.

Upvotes: 3

Milan Kovarik
Milan Kovarik

Reputation: 56

I had a similar problem in Prism 7, where I ended up to use Prism.Unit.PrismApplication for App.xaml.cs. But for the rest services I was able to use Autofac. Overrided ConfigureModuleCatalog

 protected override void ConfigureModuleCatalog(IModuleCatalog moduleCatalog)
        {
            base.ConfigureModuleCatalog(moduleCatalog);
            moduleCatalog.AddModule<MyModule>();

            Bootstrapper.Run(this, new List<AutofacModuleBase>()
                                {
                                    // autofac modules
                                });

        }

public class Bootstrapper
{
    public static void Run(PrismApplicationBase prismApplicationBase,
        List<AutofacModuleBase> modules)
    {
       // other codes
        ContainerBuilder builder = new ContainerBuilder();            
        builder.RegisterModule(new ClientApplicationPrismModule(prismApplicationBase.Container));
        foreach (AutofacModuleBase autofacModuleBase in modules)
        {
            builder.RegisterModule(autofacModuleBase);
        }

        IContainer containerBuild = builder.Build();
        ServiceManager.Instance.SetContainerDirty(containerBuild);
       // other codes
    }

}

Resolve from Autofac

public class ClientApplicationPrismModule : AutofacModuleBase
{
    public ClientApplicationPrismModule(IContainerProvider container)
    {
        Container = container;
    }

    public IContainerProvider Container { get; set; }

    protected override void Load(ContainerBuilder builder)
    {
        RegisterTypeSpecial<IDialogService>(builder);
        RegisterTypeSpecial<IDialogWindow>(builder);
        RegisterTypeSpecial<IModuleInitializer>(builder);
        RegisterTypeSpecial<IModuleManager>(builder);
        RegisterTypeSpecial<RegionAdapterMappings>(builder);
        RegisterTypeSpecial<IRegionManager>(builder);
        RegisterTypeSpecial<IEventAggregator>(builder);
        RegisterTypeSpecial<IRegionViewRegistry>(builder);
        RegisterTypeSpecial<IRegionBehaviorFactory>(builder);
        RegisterTypeSpecial<IRegionNavigationJournalEntry>(builder);
        RegisterTypeSpecial<IRegionNavigationJournal>(builder);
        RegisterTypeSpecial<IRegionNavigationService>(builder);
        RegisterTypeSpecial<IRegionNavigationContentLoader>(builder);
        RegisterTypeSpecial<IContainerExtension>(builder, false);
    }

    protected void RegisterTypeSpecial<TFrom>(ContainerBuilder builder, bool isSingleInstace = true)
    {
        IRegistrationBuilder<TFrom, SimpleActivatorData, SingleRegistrationStyle> registration 
            = builder.Register((comp) =>
        {
            TFrom service = Container.Resolve<TFrom>();
            return service;
        }).As<TFrom>()
            .IfNotRegistered(typeof(TFrom));

        if (isSingleInstace)
        {
            registration.SingleInstance();
        }
    }
}

Upvotes: 4

Related Questions