虽然之前我曾在Castle Windsor使用仿制药,但这种特殊的组合目前让我感到难过。
我想将它解析为构造函数参数,通过显式调用resolve()在此单元测试中进行模拟。
但我无法弄清楚我需要做什么注册和解决的组合。 我在下面显示了一个失败测试的代码,以解决问题。
public abstract class BaseSettings<T> where T : class
{
protected void Save(T obj)
{ }
}
public class AddinSettings : BaseSettings<AddinSettings>
{ }
public class OtherSettings : BaseSettings<OtherSettings>
{ }
public class LogConfig<T> where T : class
{
private readonly BaseSettings<T> _client;
public LogConfig(BaseSettings<T> client)
{
_client = client;
}
public BaseSettings<T> Client
{
get { return _client; }
}
}
[Test]
public void resolve_generics()
{
var container = new WindsorContainer();
container.Register(Component.For<OtherSettings >());
var otherSettings = container.Resolve<LogConfig<OtherSettings>>();
Assert.That(otherSettings, Is.Not.Null);
}
答案 0 :(得分:3)
首先,需要注册一个开放的泛型类型LogConfig<>
,如@Marwijn所做的那样。
然后,您可以使用BaseSettings<T>
和BasedOn(typeof(BaseSettings<>))
选择base type/condition和service for the component来注册所有WithService.Base()
实施。
以下测试方法证明了这一点:
[TestMethod]
public void resolve_generics()
{
// arrange
var container = new WindsorContainer();
container.Register(
Component.For(typeof(LogConfig<>)),
Classes.FromThisAssembly().BasedOn(typeof(BaseSettings<>)).WithService.Base());
//act
var otherSettings = container.Resolve<LogConfig<OtherSettings>>();
var addinSettings = container.Resolve<LogConfig<AddinSettings>>();
// assert
otherSettings.Should().NotBeNull();
otherSettings.Client.Should().BeOfType<OtherSettings>();
addinSettings.Should().NotBeNull();
addinSettings.Client.Should().BeOfType<AddinSettings>();
}
关于registering types based on base class的类似问题还有另一个答案。
答案 1 :(得分:0)
你可以试试这个:
container.Register(
Component.For(typeof(LogConfig<>)),
Component.For<BaseSettings<OtherSettings>>().ImplementedBy<OtherSettings>());
古德勒克, Marwijn。