将结构图转换为Autofac

时间:2012-08-23 11:29:44

标签: silverlight dependency-injection structuremap autofac

我最近购买了一本关于MVVM的非常好的书 - Silverlight和WPF中的MVVM企业架构生存指南

不幸的是,其中一个与IoC有关的部分有很多针对StructureMap的代码示例,这些示例不适用于Silverlight

任何人都可以指向一个链接,帮助我将结构图代码转换为Autofac,这是我正在使用的注入工具

代码使用创建类和引导程序的工厂方法

using Northwind.ViewModel;
using StructureMap;

namespace Northwind.UI.WPF
{
    public class BootStrapper
    {
        public MainWindowViewModel MainWindowViewModel
        {
            get
            {
                return ObjectFactory
                    .GetInstance<MainWindowViewModel>();
            }
        }

        public BootStrapper()
        {
            ObjectFactory.Initialize(
                o => o.Scan(
                    a =>
                    {
                        a.WithDefaultConventions();
                        a.AssembliesFromApplicationBaseDirectory(
                            d => d.FullName
                                .StartsWith("Northwind"));
                        a.LookForRegistries();
                    }));
        }
    }


    using StructureMap;

    namespace Northwind.ViewModel
    {
    public class CustomerDetailsViewModelFactory 
        : ICustomerDetailsViewModelFactory
    {
        private readonly IContainer _container;

        public CustomerDetailsViewModelFactory(
            IContainer container)
        {
            _container = container;
        }

        public CustomerDetailsViewModel CreateInstance(
            string customerID)
        {
            return _container
                .With("customerID")
                .EqualTo(customerID)
                .GetInstance<CustomerDetailsViewModel>();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

Autofac和StructureMap的工作方式不同,所以你不能一对一地“翻译”它 但是,这就是它应该是什么样的来实现同样的目标 我做了一些假设,因为并不是所有东西都可以用来测试你的代码。

public class BootStrapper
{
    private readonly ILifetimeScope _container;

    public BootStrapper()
    {
        var builder = new ContainerBuilder();

        Assembly[] assemblies =
            GetAssembliesFromApplicationBaseDirectory(
                x => x.FullName.StartsWith("Northwind"));

        builder.RegisterAssemblyTypes(assemblies)
               .AsImplementedInterfaces();

        // Module in Autofac = Registry in StructureMap
        builder.RegisterAssemblyModules(assemblies);

        Assembly viewModelAssembly =
            typeof(MainWindowViewModel).Assembly;

        builder.RegisterAssemblyTypes(viewModelAssembly);

        _container = builder.Build();
    }

    private static Assembly[] GetAssembliesFromApplicationBaseDirectory(Func<AssemblyName, bool> condition)
    {
        string baseDirectoryPath =
            AppDomain.CurrentDomain.BaseDirectory;

        Func<string, bool> isAssembly =
            file => string.Equals(
                Path.GetExtension(file), ".dll", StringComparison.OrdinalIgnoreCase);

        return Directory.GetFiles(baseDirectoryPath)
                        .Where(isAssembly)
                        .Where(f => condition(new AssemblyName(f)))
                        .Select(Assembly.LoadFrom)
                        .ToArray();
    }

    public MainWindowViewModel MainWindowViewModel
    {
        get
        {
            return _container.Resolve<MainWindowViewModel>();
        }
    }
}

public class CustomerDetailsViewModelFactory : ICustomerDetailsViewModelFactory
{
    private readonly ILifetimeScope _container;

    public CustomerDetailsViewModelFactory(ILifetimeScope container)
    {
        _container = container;
    }

    public CustomerDetailsViewModel CreateInstance(string customerID)
    {
        return _container.Resolve<CustomerDetailsViewModel>(
                new NamedParameter("customerID", customerID));
    }
}