아래의 유닛 테스트에서 MyInterFace [] 배열의 두 개의 다른 그룹을 주입하려고합니다.하지만 잘못된 방법으로 처리하는 것처럼 보입니다. 인스턴스를 얻을 것이므로 오히려 비효율적이다 IMyInterface의 모든 내 구현, ....컬렉션의 다른 그룹을 해결
namespace UnitTest.Interface
{
public interface IMyInterface
{
}
}
namespace UnitTest.ArrayGroup1
{
public class MyInjected1 : IMyInterface
{
public static int Instancecount { get; set; }
public MyInjected1()
{
Instancecount++;
}
}
public class MyInjected2 : IMyInterface
{
public static int Instancecount { get; set; }
public MyInjected2()
{
Instancecount++;
}
}
}
namespace UnitTest.ArrayGroup2
{
public class MyInjected3 : IMyInterface
{
public static int Instancecount { get; set; }
public MyInjected3()
{
Instancecount++;
}
}
public class MyInjected4 : IMyInterface
{
public static int Instancecount { get; set; }
public MyInjected4()
{
Instancecount++;
}
}
}
namespace UnitTest
{
public class MyClass1
{
private IMyInterface[] collection;
public MyClass1(IMyInterface[] group1collection)
{
collection = group1collection;
}
}
public class MyClass2
{
private IMyInterface[] collection;
public MyClass2(IMyInterface[] group2collection)
{
collection = group2collection;
}
}
public class MySubResolver : ISubDependencyResolver
{
private readonly IKernel kernel;
public MySubResolver(IKernel kernel)
{
this.kernel = kernel;
}
public bool CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
{
return dependency.TargetType == typeof(IMyInterface[]);
}
public object Resolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
{
IMyInterface[] res;
if (dependency.DependencyKey == "group1collection")
res= kernel.ResolveAll<IMyInterface>().Where(t =>
{
var ns = t.GetType().Namespace;
return ns != null && ns.StartsWith("UnitTest.ArrayGroup1");
}).ToArray();
else
res= kernel.ResolveAll<IMyInterface>().Where(t =>
{
var ns = t.GetType().Namespace;
return ns != null && ns.StartsWith("UnitTest.ArrayGroup2");
}).ToArray();
return res;
}
}
[TestClass]
public class UnitTest1
{
[TestMethod]
public void TestMethod1()
{
var kernel = new DefaultKernel(new DefaultProxyFactory());
kernel.Resolver.AddSubResolver(new MySubResolver(kernel));
var container = new WindsorContainer(kernel, new DefaultComponentInstaller());
container.Register(
Classes.FromThisAssembly()
.BasedOn<IMyInterface>()
.WithServiceFirstInterface()
.LifestyleTransient());
container.Register(Component.For<MyClass1>().LifeStyle.Transient);
container.Register(Component.For<MyClass2>().LifeStyle.Transient);
var sut=container.Resolve<MyClass1>();
Assert.AreEqual(MyInjected1.Instancecount, 1);
Assert.AreEqual(MyInjected2.Instancecount, 1);
Assert.AreEqual(MyInjected3.Instancecount, 0);
Assert.AreEqual(MyInjected4.Instancecount, 0);
}
}
}
어떻게 ResolveAll 내 SubResolver에 전화 않기 때문에 나는 단지 내가 정말 필요로하는 클래스로 생성 된 인스턴스를 얻을의 생성 ??
TIA
/소렌 지금은 질문을 이해
그게 .... 그것을 해결할 것이다 고마워 .... – smolesen