这份原稿.微与统一

本文关键字: | 更新日期: 2023-09-27 18:06:48

目前我正在学习更多关于calibre的知识。微,它是惊人的。

在我的小演示项目中,有一些导航,有MEF和EventAggregator。

因为我想使用口径。在一个已经使用unity的项目中,我想在DI中使用Unity。

我如何设置bootstrapper使用Unity?

除了MindScape教程和codeplex页面上的教程之外,任何好的教程都非常受欢迎。

这份原稿.微与统一

我发现CM的Wiki非常有帮助,并且来自Unity/CSL背景的Bootstrapper<TRootModel>方法名称和签名是直观的。

我想分享我自己的类UnityBootstrapper<TRootModel>利用Unity 3,它是小的,干净的,做你所期望的。

/// <summary>
/// <para>Unity Bootstrapper for Caliburn.Micro</para>
/// <para>You can subclass this just as you would Caliburn's Bootstrapper</para>
/// <para>http://caliburnmicro.codeplex.com/wikipage?title=Customizing%20The%20Bootstrapper</para>
/// </summary>
/// <typeparam name="TRootModel">Root ViewModel</typeparam>
public class UnityBootstrapper<TRootModel>
    : Bootstrapper<TRootModel>
    where TRootModel : class, new()
{
    protected UnityContainer Container
    {
        get { return _container; }
        set { _container = value; }
    }
    private UnityContainer _container = new UnityContainer();
    protected override void Configure()
    {
        if (!Container.IsRegistered<IWindowManager>())
        {
            Container.RegisterInstance<IWindowManager>(new WindowManager());
        }
        if (!Container.IsRegistered<IEventAggregator>())
        {
            Container.RegisterInstance<IEventAggregator>(new EventAggregator());
        }
        base.Configure();
    }
    protected override void BuildUp(object instance)
    {
        instance = Container.BuildUp(instance);
        base.BuildUp(instance);
    }
    protected override IEnumerable<object> GetAllInstances(Type type)
    {
        return Container.ResolveAll(type);
    }
    protected override object GetInstance(Type type, string name)
    {
        var result = default(object);
        if (name != null)
        {
            result = Container.Resolve(type, name);
        }
        else
        {
            result = Container.Resolve(type);
        }
        return result;
    }
}

您可以直接实例化它,提供一个有效的泛型类型参数,或者您可以子类化并自定义诸如生命周期管理器之类的东西:

public class AppBootstrapper
    : UnityBootstrapper<ViewModels.AppViewModel>
{
    protected override void Configure()
    {
        // register a 'singleton' instance of the app view model
        base.Container.RegisterInstance(
            new ViewModels.AppViewModel(), 
            new ContainerControlledLifetimeManager());
        // finish configuring for Caliburn
        base.Configure();
    }
}

您必须在bootstrapper中重写4种方法来连接IoC容器(当使用Boostrapper<T>时):

  1. Configure()

  2. GetInstance(string, Type)

    根据类型和键检索对象——据我所知,它通常被框架用于检索,例如视图模型,常规依赖项。所以这里你的容器必须以某种方式获得一个基于string和/或Type的实例(通常类型,字符串是在你使用视图优先绑定将模型连接到视图时使用)。通常容器都有类似的内置方法,这些方法可以开箱即用,或者只需要稍微调整一下。

  3. GetAllInstances(Type)

    对象集合的检索(仅按类型)——同样,根据我的经验,这通常是由Caliburn使用的。

  4. BuildUp(object)

如果你感兴趣,我有一个使用SimpleInjector(或Autofac)的示例,不幸的是我没有Unity的经验。

[编辑]

样品时间!这个是使用SimpleInjector。

public class MainViewModel
{
//...
}
public class ApplicationBootstrapper : Bootstrapper<MainViewModel>
{
    private Container container;
    protected override void Configure()
    {
        container = new Container();
        container.Register<IWindowManager, WindowManager>();
      //for Unity, that would probably be something like:
      //container.RegisterType<IWindowManager, WindowManager>();
        container.RegisterSingle<IEventAggregator, EventAggregator>();
        container.Verify();
    }
    protected override object GetInstance(string key, Type service)
    {
        // Now, for example, you can't resolve dependency by key in SimpleInjector, so you have to
        // create the type out of the string (if the 'service' parameter is missing)
        var serviceType = service;
        if(serviceType == null)
        {
            var typeName = Assembly.GetExecutingAssembly().DefinedTypes.Where(x => x.Name == key).Select(x => x.FullName).FirstOrDefault();
            if(typeName == null)
                throw new InvalidOperationException("No matching type found");
            serviceType = Type.GetType(typeName);
        }
        return container.GetInstance(serviceType);
        //Unity: container.Resolve(serviceType) or Resolve(serviceType, name)...?
    }
    protected override IEnumerable<object> GetAllInstances(Type service)
    {
        return container.GetAllInstances(service);
        //Unity: No idea here.
    }
    protected override void BuildUp(object instance)
    {
        container.InjectProperties(instance);
        //Unity: No idea here.
    }
}
相关文章:
  • 没有找到相关文章