Unity.AutoRegistration ??基于会议的注册统一

时间:2013-06-18 12:06:44

标签: c# .net unity-container design-patterns

我的代码如下

IUnityContainer container = new UnityContainer(); 

container
.ConfigureAutoRegistration()
.LoadAssemblyFrom(typeof(Test).Assembly.Location)
.LoadAssemblyFrom(typeof(ITest).Assembly.Location)
.ApplyAutoRegistration();

这是我的第一个问题。

我不确定我是否在这里正确使用了LoadAssemblyFrom方法:

ITest test = container.Resolve<ITest>(); 

当我尝试编译时,我得到异常“ResolutionFailedException”。

我做错了什么?

感谢您的提前时间。

2 个答案:

答案 0 :(得分:4)

看来你正在寻找的是:

container.ConfigureAutoRegistration()
         .LoadAssemblyFrom(typeof(ITest).Assembly.Location)
         .LoadAssemblyFrom(typeof(Test).Assembly.Location)
         .Include(If.ImplementsITypeName, Then.Register())
         .ApplyAutoRegistration();

这将告诉Unity.AutoRegistration注册所有类型的接口,前缀为I。

答案 1 :(得分:1)

这是一个完整的工作控制台示例,显示如何按惯例设置Unity以进行注册,然后将控制转移到依赖注入世界。为此,您必须添加Unity NuGet包。

使用Unity v3.5和VS 2012进行测试。

#region
using System;
using Microsoft.Practices.Unity;

#endregion

namespace Demo___Unity
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            using (var container = new UnityContainer())
            {
                // Manual method.
                //container.RegisterType<IEntryPoint, EntryPoint>();
                //container.RegisterType<IInjected, Injected>();

                // Set up registration by convention.
                // http://blogs.msdn.com/b/agile/archive/2013/03/12/unity-configuration-registration-by-convention.aspx
                container.RegisterTypes(
                    AllClasses.FromAssembliesInBasePath(),
                    WithMappings.FromMatchingInterface,
                    WithName.Default,
                    WithLifetime.ContainerControlled);

                var controller = container.Resolve<IEntryPoint>();
                controller.Main();
            }
        }
    }

    public interface IEntryPoint
    {
        string Name { get; set; }
        void Main();
    }

    public class EntryPoint : IEntryPoint
    {
        private readonly IInjected Injected;

        public EntryPoint(IInjected injected)
        {
            Injected = injected;
        }

        public void Main()
        {
            Console.Write("Hello, world!\n");
            Injected.SubMain();
            Injected2.SubMain();
            Console.Write("[any key to continue]");
            Console.ReadKey();
        }

        // Demonstrates property injection.
        [Dependency]
        public IInjected Injected2 { get; set; }

        public string Name { get; set; }
    }

    public interface IInjected
    {
        void SubMain();
    }

    public class Injected : IInjected
    {
        public void SubMain()
        {
            Console.Write("Hello, sub world!\n");
        }

        public string Name { get; set; }
    }
}