我正在开发一个 Webmethod 集合的客户端(Silverlight)接口。我试图避免为每个网络方法编写任何自定义代码。所以我创建了一个ServiceCall<TResult>
处理每个电话,TResult
指定服务的返回类型(我使用XmlSerializer
创建返回的实例)。客户端类公开了一个与每个 webmethod 匹配的函数,该函数所要做的就是创建一个新的实例ServiceCall<TResult>
,与TResult
指定为方法的预期返回类型。
这效果很好。
我也在使用Ninject http://ninject.org/(依赖注入器)尝试保持一切独立。 Ninject 支持开放泛型,这非常适合我的ServiceCall<TResult>
.
但这也意味着我正在注入对 Ninject 容器的引用。这隐藏了对ServiceCall<TResult>
被绑定到容器上。所以我想注入一个工厂来创建我的ServiceCall<TResult>
实例。这并不棘手,但我想让它成为一个通用的通用工厂。意思是我想要类似的东西Factory<T<>>
这会有一个方法public T<TU> Createinstance<TU>()
.
但我不知道如何使用本身就是开放泛型的类型参数创建泛型类。
在.Net 中是否有可能? - 或者我必须创建一个特定的服务调用工厂吗?
Edit:我正在使用依赖项的接口,但不需要将它们混合到此处的问题中,因此我将其编辑为问题。
回复蒂姆维:使用依赖注入 (DI) 的常见方法是将接口绑定到您的实现,只有容器知道这些绑定。然后,您可以针对接口进行编码。这带来了很多优势。我在这里无法提及的更多。
无论如何,它也排除了静态类(因为这将是对特定类的依赖)。相反,我将指示容器(在本例中为 Ninject)始终以类似单例的行为为工厂接口提供相同的实例。
这排除了public static class Factory<T>
选项,因为它是静态的,如果它不是静态的,我现在需要使用我要使用的每种类型的 T,这在某种程度上违背了拥有泛型类的目的。
建议使用具有“完全通用”方法的非通用类(如我传入ServiceCall<MyResult>
而不仅仅是MyResult
),或多或少就是我现在正在做的事情(减去静态类部分)。 Ninject 容器有一个 Get 方法,其工作方式与您的第二个建议类似。
这个问题有两部分;首先,它使我的代码直接依赖于一个容器(Ninject),但这对我来说并不是一个大问题。让我恼火的是,如果你从外部看我的客户端,你只会看到对 Ninject 的依赖。在运行 try to make a call 之前,您不会知道客户端需要使用 Ninject 注册的 ServiceCall 实现才能工作。
但如果 Client 构造函数采用 Factory> 类型的参数,那么它会更清晰。
无论如何,我认为这将是一个常见问题,因此要么有一个常见的解决方案,要么这不是一个常见问题,而我正在尝试做一些愚蠢的事情;)
我仍然不太喜欢依赖注入,所以情况很可能就是这样。
这是你想要的:通用工厂模式 http://www.robertsindall.co.uk/blog/generic-factory-pattern-open-closed-principle/
namespace GenericFactoryPatternTestApp
{
public class Factory< T >
{
private readonly Dictionary< string, Type > _factoryDictionary = new Dictionary< string, Type >();
public Factory()
{
Type[] types = Assembly.GetAssembly(typeof (T)).GetTypes();
foreach (Type type in types)
{
if (!typeof (T).IsAssignableFrom(type) || type == typeof (T))
{
// Incorrect type
continue;
}
// Add the type
_factoryDictionary.Add(type.Name, type);
}
}
public T Create< V >(params object[] args)
{
return (T) Activator.CreateInstance(_factoryDictionary[typeof (V).Name], args);
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)