Silverlight 结构图到Autofac的转换

Silverlight 结构图到Autofac的转换,silverlight,dependency-injection,structuremap,autofac,Silverlight,Dependency Injection,Structuremap,Autofac,我最近出版了一本关于MVVM的好书——Silverlight和WPF中企业架构的MVVM生存指南 不幸的是,其中一个与IoC相关的部分有很多StructureMap的代码示例,而Silverlight没有这些示例 有人能给我指出一个链接,帮助我将结构映射代码翻译成Autofac吗?Autofac是我正在使用的注入工具 代码使用工厂方法创建类和引导程序 using Northwind.ViewModel; using StructureMap; namespace Northwind.UI.WP

我最近出版了一本关于MVVM的好书——Silverlight和WPF中企业架构的MVVM生存指南

不幸的是,其中一个与IoC相关的部分有很多StructureMap的代码示例,而Silverlight没有这些示例

有人能给我指出一个链接,帮助我将结构映射代码翻译成Autofac吗?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>();
        }
    }
}
使用Northwind.ViewModel;
使用结构图;
命名空间Northwind.UI.WPF
{
公共类引导程序
{
公共主窗口视图模型主窗口视图模型
{
得到
{
返回对象工厂
.GetInstance();
}
}
公共引导程序()
{
ObjectFactory.Initialize(
o=>o.扫描(
a=>
{
a、 使用默认约定();
a、 AssembliesFromApplicationBaseDirectory(
d=>d.FullName
.StartsWith(“北风”);
a、 查找注册表();
}));
}
}
使用结构图;
命名空间Northwind.ViewModel
{
公共类CustomerDetailsViewModelFactory
:ICCustomerDetailsViewModelFactory
{
专用只读IContainer\u容器;
公共客户详细信息查看模型工厂(
i集装箱)
{
_容器=容器;
}
公共CustomerDetailsViewModel CreateInstance(
字符串(自定义ID)
{
返回容器
.带有(“customerID”)
.EqualTo(客户ID)
.GetInstance();
}
}
}

Paul

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));
    }
}
公共类引导程序
{
专用只读ILifetimeScope\u容器;
公共引导程序()
{
var builder=new ContainerBuilder();
程序集[]程序集=
GetAssembliesFromApplicationBaseDirectory(
x=>x.FullName.StartsWith(“北风”);
builder.RegisterAssemblyTypes(程序集)
.a实现接口();
//Autofac中的模块=StructureMap中的注册表
builder.RegisterAssemblyModule(程序集);
部件视图模型部件=
类型(MainWindowViewModel).Assembly;
RegisterAssemblyTypes(viewModelAssembly);
_container=builder.Build();
}
私有静态程序集[]GetAssembliesFromApplicationBaseDirectory(Func条件)
{
字符串baseDirectoryPath=
AppDomain.CurrentDomain.BaseDirectory;
Func isAssembly=
file=>string.Equals(
GetExtension(文件),“.dll”,StringComparison.OrdinalIgnoreCase);
return Directory.GetFiles(baseDirectoryPath)
.在哪里(组装)
.其中(f=>条件(新程序集名称(f)))
.Select(Assembly.LoadFrom)
.ToArray();
}
公共主窗口视图模型主窗口视图模型
{
得到
{
返回_container.Resolve();
}
}
}
公共类CustomerDetailsViewModelFactory:ICCustomerDetailsViewModelFactory
{
专用只读ILifetimeScope\u容器;
公共客户详细信息视图模型工厂(ILifetimeScope容器)
{
_容器=容器;
}
公共CustomerDetailsViewModel CreateInstance(字符串customerID)
{
return\u container.Resolve(
新命名参数(“customerID”,customerID));
}
}