首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Castle使用非泛型实现注入开放泛型接口

使用Castle使用非泛型实现注入开放泛型接口
EN

Stack Overflow用户
提问于 2011-06-01 16:48:58
回答 1查看 867关注 0票数 2

我有一个开放的泛型接口,我用一个非泛型类实现了它,我想用castle windsor注入这个类,但我正在努力...

假设我有以下接口

代码语言:javascript
复制
public interface IMyInterface<T>
{
    bool DoSomething(T param);
}

然后我有以下类来实现这个接口,如下所示

代码语言:javascript
复制
public class MyClass : IMyInterface<string>
{
    public bool DoSomething(string param)
    {
        // Do Something
        return true;
    }
}

我希望能够像这样使用castle来解析接口,这样injectedObject就可以成为MyClass的一个实例。

代码语言:javascript
复制
WindsorContainer container = new WindsorContainer(new XmlInterpreter(newConfigResource("castle")));
IMyInterface<string> injectedObject = container.Resolve<IMyInterface<string>>();

这是可能的吗,还是我稍微偏离了轨道?如果可能,我如何设置城堡配置部分?我尝试使用'1表示法来表明接口是一个开放的泛型类型,但是如果实现不是泛型的,你就会得到一个错误,在本例中不是。

感谢您的任何帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-01 17:04:31

我们在我的团队中使用fluent接口,所以我已经有一段时间没有研究过配置文件语法了。基本原则是:您的服务是IMyInterface<string>,实现类型是MyClass。所以我认为应该是这样的:

代码语言:javascript
复制
<component service="Namespace.IMyInterface`1[[System.String, mscorlib]], AssemblyName"
        type="Namespace.MyClass, AssemblyName" />

你说你得到了一个错误。错误是什么?我猜这是因为您已经将服务定义为IMyInterface<>,而没有提供类型参数。如果你想这样做,正如你的问题所暗示的,实现类型也必须是泛型的:

代码语言:javascript
复制
<component service="Namespace.IMyInterface`1, AssemblyName"
        type="Namespace.MyGenericClass`1, AssemblyName" />

请注意,您可以注册这两个组件。如果这样做,解析IMyInterface<string>将得到MyClass的一个实例,而解析IMyInterface<AnyOtherType>将得到MyGenericClass<AnyOtherType>的一个实例。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6198518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档