Castle Windsor解析和泛型

7

我有以下内容:

public interface ISubject { ... }

public class Subject<T> : ISubject { ... }

public class MyCode<T> {
    ...
    pulic void MyMethod()
    {
        var item = container.Resolve<ISubject>(); //????? how do I pass in T
    }
    ... 
 }

在这种情况下,我该如何解决呢?
谢谢 安东尼
1个回答

14

vdhant - 这不是容器的正确使用方式。

你想要使用 ISubject,对吗?如果你传递 T ,那么你就破坏了抽象性,因为你的调用者必须知道 ISubject 实际上是一个 Subject,并且更重要的是,它是一个 Subject<T>,需要一个具体的 T。

没有容器会允许这样做,但这是一个设计问题,而不是工具问题。

解决你的设计问题的一种方法是使其变得明确 - 将 ISubject 更改为 ISubject<T>

然后,你可以注册开放式泛型类型 ISubject<>,并将其绑定到开放式泛型类型 Subject<>

container.Register(Component.For(typeof(ISubject<>))
                            .ImplementedBy(typeof(Subject<>)));

那么您就能够做到:
var fooSubject = container.Resolve<ISubject<Foo>>();

你没有提供任何上下文信息,因此我的回答可能有偏差,但有一件事是确定的——你面临一个设计问题。


很酷,我的意思是我需要提供一个接口的通用版本,然后我可以做我想做的事情... 对我来说听起来很不错。干杯 - vdhant
很高兴能帮助@EhsanSajjad - Krzysztof Kozmic
@KrzysztofKozmic 你能帮我理解如何集成WCF所有服务合同吗?还是我需要一个一个地添加,比如“IUserService”,“IAuthenticateService”等? - Ehsan Sajjad
@EhsanSajjad 尝试使用 WithServiceAllInterfaces,或者如果您需要更多控制,可以使用自定义谓词。 - Krzysztof Kozmic
我需要在ASP.NET MVC Web应用程序中绑定WCF服务,我已经进行了研究,但没有找到任何适当的示例,尽管找到了一些不完整的示例。 - Ehsan Sajjad
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接