У меня есть 2 классов - ModelBuilders
: каждый из него реализует интерфейс с почти таким же способом:Тип выхода в Factory
public interface ICanBuildLocalListingsFacebookModel
{
Task<LocalListingsFacebookModel> BuildAsync(Guid userId, int folderId, DateTime? startDate, DateTime? endDate,
Guid? companyId);
}
public interface ICanBuildLocalListingsGoogleMyBusinessModel
{
Task<LocalListingsGoogleMyBusinessModel> BuildAsync(Guid userId, int folderId, DateTime? startDate,
DateTime? endDate, Guid? companyId);
}
Как вы можете видеть, BuildAsync
почти одинаковы, за исключением типа выхода.
У меня есть Factory
обнаружить, что ModelBuilder
назвать:
public class InsightsModelFactory : FactoryBase
{
private readonly IDbSessionManager dbSessionManager;
public InsightsModelFactory(IDbSessionManager dbSessionManager)
{
this.dbSessionManager = dbSessionManager;
}
public override dynamic Create(LocalListingEngagement? type)
{
switch (type)
{
case LocalListingEngagement.Facebook:
return new LocalListingsFacebookModelBuilder(dbSessionManager);
case LocalListingEngagement.GoogleMyBusiness:
return new LocalListingsGoogleMyBusinessModelBuilder(dbSessionManager);
default:
throw new NotImplementedException();
}
}
}
public abstract class FactoryBase
{
public abstract dynamic Create(LocalListingEngagement? type);
}
В настоящее время на заводе, у меня есть метод, который возвращает Create
dynamic
объект.
Это потому, что я не могу создать обычный тип для двух интерфейсов.
Есть ли хорошее решение?
Я думаю о создании какой-то общий интерфейс, который будет возвращать Task<object>
и в конкретных интерфейсов просто скрывать, что метод с ключевым словом new
, но не думаю, что это хорошее решение.
public interface ICanBuildLocalListingsGoogleMyBusinessModel: ICanBuildLocalListingsModel
{
new Task<LocalListingsGoogleMyBusinessModel> BuildAsync(Guid userId, int folderId, DateTime? startDate,
DateTime? endDate, Guid? companyId);
}
public interface ICanBuildLocalListingsModel
{
Task<object> BuildAsync(Guid userId, int folderId, DateTime? startDate,
DateTime? endDate, Guid? companyId);
}
Я понимаю это. Одна вещь, которую я не знаю, как в Factory метод 'Create' вернуть этот общий общий интерфейс ... – demo
@demo проверить обновленный ответ. – Nkosi