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) 我正在尝试注册相同的类型,但有两个不同的构造函数.当我尝试解决时,我在第二个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)
我做错了什么?
有没有办法使用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配置中执行此操作,而不是在代码中执行此操作.
提前致谢.
我在一些单元测试中收到代码分析警告:
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) 我得到了一个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)
如何在不必为所有注册命名的情况下实现这一目标?
我不知道如何以一种好的方式描述这一点,但是这里有.
我有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而且从不使用子容器,我怀疑这可能是有用的.我正在玩这个,但事实证明它非常混乱.可以轻松完成吗?
作为团结基本演示的一部分,我创建了以下控制台应用程序(有点冗长):
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) 我创建了一个简单的PRISM应用程序,其中包含一个继承自UnityBootstrapper的标准引导程序.
UnityBootstrapper又具有公共属性IUnityContainer,并且此接口具有以下解析单元:
object Resolve(Type t, string name, params ResolverOverride[] resolverOverrides);
Run Code Online (Sandbox Code Playgroud)
现在,我不知道如何获得这里描述的其他解决方法.
我是否将Unity与其IUnityContainer接口混淆了?
我试图按照这个博客来实现与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
由于我的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。有什么想法我可以做什么,或者可以替代这个问题?
unity-container ×10
c# ×6
.net ×1
asp.net-mvc ×1
fxcop ×1
moq ×1
performance ×1
resolve ×1
unit-testing ×1