标签: unity-container

为什么Unity的RegisterInstance <...>会导致Unity返回多个实例?

Unity的文档说明了注册实例的RegisterInstance <>方法,以便每次调用Resolve <>时返回该特定实例.

但是,下面的示例显示每次调用Resolve <>时,都会返回该类型的新实例.

为什么是这样?

using System;
using System.Windows;
using Microsoft.Practices.Unity;

namespace TestUnity34
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            Validator validator1 = new Validator();
            IUnityContainer container = new UnityContainer();
            container.RegisterInstance<IValidator>(validator1);

            Validator validatorCopied = validator1;
            Console.WriteLine(validator1.GetHashCode()); //14421545
            Console.WriteLine(validatorCopied.GetHashCode()); //14421545

            Validator validator2 = container.Resolve<Validator>();
            Console.WriteLine(validator2.GetHashCode()); //35567111

            Validator validator3 = container.Resolve<Validator>();
            Console.WriteLine(validator3.GetHashCode()); //65066874
        }
    }

    interface IValidator
    {
        void Validate();
        string GetStatus();
    }

    public class Validator : IValidator
    {
        public void Validate() …
Run Code Online (Sandbox Code Playgroud)

unity-container

3
推荐指数
1
解决办法
5584
查看次数

如何在Unity中使用不同的构造函数两次注册相同的类型?

我正在尝试注册相同的类型,但有两个不同的构造函数.当我尝试解决时,我在第二个Resolve上得到" 依赖失败的解决方案".

    var container = new UnityContainer();

    container.RegisterType<IBar, Bar>()
        .RegisterInstance(new Bar())
        .RegisterType<IBar, Bar>()
        .RegisterInstance(new Bar("foo"));

    Bar bar1 = (Bar)container.Resolve<IBar>();
    Bar bar2 = (Bar)container.Resolve<IBar>("foo");  // ERROR
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

c# ioc-container unity-container

3
推荐指数
1
解决办法
1837
查看次数

Unity Framework - 将整数和字符串传递给已解析的对象

有没有办法使用Unity框架将整数作为参数传递给构造函数或已解析的对象?

伪码..

IService svc = Container.Resolve<ConcreteService>()
Run Code Online (Sandbox Code Playgroud)

在这种情况下,混凝土服务将是这样的......

public class ConcreteService
{
    public ConcreteService(int val)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

另外,我需要在xml配置中执行此操作,而不是在代码中执行此操作.

提前致谢.

c# inversion-of-control unity-container

3
推荐指数
1
解决办法
2648
查看次数

代码分析警告CA2000:对对象'new ContainerControlledLifetimeManager()'调用Dispose

我在一些单元测试中收到代码分析警告:

WidgetManagerTests.cs(40):CA2000:Microsoft.Reliability:在方法'WidgetManagerTests.TestInitialize()'中,在对所有引用超出范围之前,在对象'new ContainerControlledLifetimeManager()'上调用System.IDisposable.Dispose.

我正在使用Unity和Moq,这是违规行:

var loggingServiceMock = new Mock<ILoggingService>();
            this.unityContainer.RegisterInstance<ILoggingService>(loggingServiceMock.Object, new ContainerControlledLifetimeManager());
Run Code Online (Sandbox Code Playgroud)

code-analysis fxcop unity-container

3
推荐指数
1
解决办法
2604
查看次数

解决所有不使用名称的问题

我得到了一个IStartable由几个混凝土实现的接口.所有人都注册UnityContainer使用RegisterType没有名字.

我想要实现的是:

_container.ResolveAll<IStartable>().ForEach(startable => startable.Start());
//application lifetime
_container.ResolveAll<IStartable>().ForEach(startable => startable.Stop());
Run Code Online (Sandbox Code Playgroud)

如何在不必为所有注册命名的情况下实现这一目标?

.net unity-container

3
推荐指数
1
解决办法
197
查看次数

团结和终身管理

我不知道如何以一种好的方式描述这一点,但是这里有.

我有4个班:A,B,C,D.

A注入B,C,D
C注入D.

A是每个决心.
B是单身人士.
C和DI不知道.

我希望A和C使用相同的D实例,所以每次从容器中解析A时,D应该创建一次并注入A和C.

最简单的方法是使A简单地将D传递给C而不使用Unity.但有没有办法用Unity做到这一点?我一直只使用ContainerControlledLifetimeManager和PerResolveLifetimeManager而且从不使用子容器,我怀疑这可能是有用的.我正在玩这个,但事实证明它非常混乱.可以轻松完成吗?

c# dependency-injection unity-container

3
推荐指数
1
解决办法
8784
查看次数

UnityContainer性能测试结果

作为团结基本演示的一部分,我创建了以下控制台应用程序(有点冗长):

IUnityContainer container = new UnityContainer();
        container.RegisterType<ISimpleClass, SimpleClass>();
        container.RegisterType<ISingletonWithUnity, SingletonWithUnity>(new ContainerControlledLifetimeManager());

        double N = 10000;
        double sum = 0;

        Console.WriteLine("Testing performace of a basic new object");
        for (int i = 0; i < N; i++)
        {
            DateTime start = DateTime.Now;
            ISimpleClass simpleClass = new SimpleClass();
            DateTime end = DateTime.Now;
            sum += (end - start).Milliseconds;
        }
        double average = sum/N;
        Console.WriteLine("Average time for basic new object is: " + average);


        Console.WriteLine("Testing performance of transient resolve using unity");
        sum = 0;
        for …
Run Code Online (Sandbox Code Playgroud)

c# performance unity-container console-application

3
推荐指数
1
解决办法
1597
查看次数

C#IUnityContainer解析方法

我创建了一个简单的PRISM应用程序,其中包含一个继承自UnityBootstrapper的标准引导程序.

UnityBootstrapper又具有公共属性IUnityContainer,并且此接口具有以下解析单元:

object Resolve(Type t, string name, params ResolverOverride[] resolverOverrides);
Run Code Online (Sandbox Code Playgroud)

现在,我不知道如何获得这里描述的其他解决方法.

我是否将Unity与其IUnityContainer接口混淆了?

c# unity-container resolve

3
推荐指数
1
解决办法
3099
查看次数

使用Unity错误的ASP.NET Web API中的依赖注入

我试图按照这个博客来实现与Unity的依赖注入,但我在boostrapper.cs中遇到错误(我使用Unity.MVC4库).有人能指出我在这里缺少什么吗?

错误:IoCContainer似乎没有实现Microsoft.Practices.ServiceLocation.IServiceLocator.参数名称:commonServiceLocator

 public static class Bootstrapper
    {
    public static IUnityContainer Initialise()
    {
      var container = BuildUnityContainer();

      DependencyResolver.SetResolver(new UnityDependencyResolver(container));

      // this throws "does not appear to implement Microsoft.Practices.ServiceLocation.IServiceLocator.... error"
      DependencyResolver.SetResolver(new IoCContainer(container)); 

      return container;
    }

    ....
  }
Run Code Online (Sandbox Code Playgroud)

这是IoCContainer类

public class ScopeContainer : IDependencyScope
    {
        protected IUnityContainer container;

        public ScopeContainer(IUnityContainer container)
        {
            if (container == null)
            {
                throw new ArgumentNullException("container");
            }
            this.container = container;
        }

        public object GetService(Type serviceType)
        {
            if (container.IsRegistered(serviceType))
            {
                return container.Resolve(serviceType);
            }
            else
            {
                return null;
            } …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc dependency-injection unity-container asp.net-mvc-4 asp.net-web-api

3
推荐指数
1
解决办法
5495
查看次数

将Moq模拟对象注册为Unity容器的类型

由于我的sut类具有带有IUnityContaineras参数的构造函数,因此我想在单元测试中设置一个新的Unity容器并将其传递给sut。我喜欢在这里使用Moq,因为对于某些方法调用,我也必须非常认真。我在这里尝试过的是

public interface IFoo
    {
        void Bar();
    }

    class Program
    {
        static void Main(string[] args)
        {
            var fooMock = new Mock<IFoo>();

            fooMock.Setup(x => x.Bar()).Callback(() => Console.WriteLine("Hello"));

            IUnityContainer container = new UnityContainer();
            container.RegisterType(typeof (IFoo), fooMock.Object.GetType());

            var sut = container.Resolve<IFoo>();
            sut.Bar();

            Console.Read();
        }
    }
Run Code Online (Sandbox Code Playgroud)

但是这导致的ResulutionFailedException。有什么想法我可以做什么,或者可以替代这个问题?

c# unit-testing moq unity-container

3
推荐指数
1
解决办法
2292
查看次数