我试图注册一些具有嵌套接口的类。 但由于某些原因,我似乎无法解决子接口问题。 我相信一些代码应该让我的意图明确,所以我们走了:
public interface IDatasetContentMarshaller<TIn, TOut> : IDatasetContentMarshallerInfo
{
TOut Marshall(CompanyDataset dataset, TIn content);
}
public interface IDatasetContentMarshallerInfo
{
Type SourceType { get; }
Type TargetType { get; }
bool CanMarshal(object source);
object Marshall(CompanyDataset dataset, object source);
}
public interface IGenericDatasetContentMarshaller
{
TOut Marshall<TIn, TOut>(CompanyDataset dataset, TIn source);
Func<CompanyDataset, TIn, TOut> GetMarshaller<TIn, TOut>();
}
当已知并修复了转换的源和目标类型时,代码将使用具有泛型类型参数的第一个接口。而且可以肯定的是,有一个类可以进行这种转换。
子接口(IDatasetContentMarshallerInfo
)包含有关转换类型的更多信息。当输入参数或返回值的类型在编译时未知时,或者如果没有可以在一个步骤中执行此操作的转换器/编组器时,最后一个接口用于获取编组器。 (示例&#39;字符串&#39;到&#39;学期&#39;可能需要&#39;字符串&#39;到&#39;日期&#39;后跟&#39; date&#39; to& #39; semester&#39 ;.通用内容编组员的任务是找到一个链式编组器来获得所需的结果。)
IGenericDatasetContentMarshaller
的构造函数如下所示:
public GenericDatasetContentMarshaller(IDatasetContentMarshallerInfo[] marshallers)
{
Marshallers = marshallers;
}
但我无法找到正确注册的方法。
无论我尝试什么,我都会收到错误,告诉我IGenericDatasetContentMarshaller
无法解决。
我为此编写的安装程序如下所示:
public class MarshallerInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Kernel.Resolver.AddSubResolver(new ArrayResolver(container.Kernel));
container.Register(Classes.FromThisAssembly().BasedOn<IDatasetContentMarshallerInfo>().LifestyleSingleton());
container.Register(Classes.FromAssemblyContaining<GenericDatasetContentMarshaller>()
.Where(Helper.IsInNamespace("Q.Services.Marshallers.Dataset"))
.LifestylePerWebRequest()
.WithService.FirstInterface());
var count = container.ResolveAll(typeof(IDatasetContentMarshallerInfo)).Length;
Console.WriteLine("Items: " + count); // logs "Items: 0"
}
}
所以我的问题是:
欢迎任何有关此主题的帮助。
PS:有可能解决&#34; top&#34;如果我要求注入像IDatasetContentMarshaller<DateTime, Semester>