5

我最近购买了一本关于 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>();
        }
    }
}

保罗

4

1 回答 1

0

Autofac and StructureMap work differently, so you can't "translate" it one to one.
However, this is what it should look like to accomplish the same.
I've made some assumptions as not everything is there to test out your code.

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));
    }
}
于 2014-01-07T13:06:44.440 回答