Silverlight 结构图到Autofac的转换
我最近出版了一本关于MVVM的好书——Silverlight和WPF中企业架构的MVVM生存指南 不幸的是,其中一个与IoC相关的部分有很多StructureMap的代码示例,而Silverlight没有这些示例 有人能给我指出一个链接,帮助我将结构映射代码翻译成Autofac吗?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
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();
}
}
}
PaulAutofac和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));
}
}