使用继承和&解析Castle中的泛型构造函数参数没有接口

时间:2014-01-20 03:20:30

标签: c#-4.0 generics dependency-injection castle-windsor windsor-3.0

虽然之前我曾在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);
    }

2 个答案:

答案 0 :(得分:3)

首先,需要注册一个开放的泛型类型LogConfig<>,如@Marwijn所做的那样。

然后,您可以使用BaseSettings<T>BasedOn(typeof(BaseSettings<>))选择base type/conditionservice 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。