我有IServiceHandler
和ISalesHandler
,并且都来自Ihandler
IHandler.cs
public interface IHandler
{
Task AddAsync(IEnumerable<IDictionary<string, object>> toAdd, int dataFileId);
Task AddAuditAsync(IEnumerable<IDictionary<string, object>> toAdd, int dataFileId);
}
IServiceHandler.cs
public interface IServiceHandler : IHandler
{
Task<IEnumerable<ACService>> GetAsync();
Task<IEnumerable<ACServiceAudit>> GetAuditAsync();
}
ISalesHandler.cs
public interface ISalesHandler : IHandler
{
Task<IEnumerable<ACSale>> GetAsync();
Task<IEnumerable<ACSaleAudit>> GetAuditAsync();
}
然后我有一个方法返回销售或服务,但问题是我将其返回为IHandler
private IHandler CreateHandler(FileType type)
{
switch (type)
{
case FileType.Sales:
return _container.GetExportedValue<ISalesHandler>("Sales");
case FileType.Service:
return _container.GetExportedValue<IServiceHandler>("Service");
case FileType.None:
return null;
}
return null;
}
这使我只能访问IHandler
中的方法,而不是IServiceHandler
或ISalesHandler
中的方法。
如何构建接口以便我可以访问所有方法?我宁愿保留CreateHandler
方法。
答案 0 :(得分:4)
实际上,您正在返回IHandler
,因此可以在不进行强制转换的情况下访问其中定义的方法。
我认为通过使用泛型可以绕过这一切,因为在派生处理程序中似乎存在一种模式。
这会为你做什么?
IHandler.cs :
public interface IHandler // I usually split the generic and non-generic methods
{
Task AddAsync(IEnumerable<IDictionary<string, object>> toAdd, int dataFileId);
Task AddAuditAsync(IEnumerable<IDictionary<string, object>> toAdd, int dataFileId);
}
public interface IHandler<TService, TServiceAudit> : IHandler
{
Task<IEnumerable<TService>> GetAsync();
Task<IEnumerable<TServiceAudit>> GetAuditAsync();
}
IServiceHandler.cs :
public interface IServiceHandler : IHandler<ACService, ACServiceAudit>
{ }
ISalesHandler.cs :
public interface ISalesHandler : IHandler<ACSale, ACSaleAudit>
{ }
答案 1 :(得分:3)
使用通用接口怎么样?
public interface IServiceHandler<TSale, TAudit> : IHandler
{
Task<IEnumerable<TSale>> GetSaleAsync();
Task<IEnumerable<TAudit>> GetAuditAsync();
}
我只是将您的GetAsync()
重命名为GetSaleAsync()
以更加明确,但这是您所希望的。
因此,您的Factory
可以拥有以下签名:
private IServiceHandler<TSale, TAudit>CreateHandler(FileType type)