2017-02-09 3 views
1

У меня есть 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); 
} 

В настоящее время на заводе, у меня есть метод, который возвращает Createdynamic объект.

Это потому, что я не могу создать обычный тип для двух интерфейсов.

Есть ли хорошее решение?


Я думаю о создании какой-то общий интерфейс, который будет возвращать 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); 
} 

ответ

0

Имейте общую базовую модель. Может быть, интерфейс или абстрактный базовый класс

abstract class ModelBase { 
    public int MyProperty1 { get; set; } 
    public string MyProperty2 { get; set; } 
    public Guid MyProperty3 { get; set; } 
} 

Общий интерфейс может построить общую модель

public interface IModelBuilder{ 
    Task<BaseModel> BuildAsync(Guid userId, int folderId, DateTime? startDate, DateTime? endDate, 
     Guid? companyId); 
} 

Походные интерфейсы могут строить от этого, убедившись, что их возвращается модель произвольной форме базовой модели.

завод будет возвращать общий интерфейс

public abstract class FactoryBase { 
    public abstract IModelBuilder Create(LocalListingEngagement type); 
} 

Реализация может использовать хранилище для хранения доступных типов и, как инициализировать реализации.

public class InsightsModelFactory : FactoryBase { 

    private readonly IDictionary<LocalListingEngagement, Func<IDbSessionManager, IModelBuilder>> strategies; 
    private readonly IDbSessionManager dbSessionManager; 

    public InsightsModelFactory(IDbSessionManager dbSessionManager) { 
     this.dbSessionManager = dbSessionManager; 
     strategies = new Dictionary<LocalListingEngagement, Func<IDbSessionManager, IModelBuilder>>(); 
     //...populate available builders or create an abstraction that can be injected. 
    } 

    public override IModelBuilder Create(LocalListingEngagement type) { 
     Func<IDbSessionManager, IModelBuilder> stratergy; 
     if (strategies.TryGetValue(type, out stratergy)) { 
      return stratergy(dbSessionManager);      
     } else { 
      throw new NotImplementedException(); 
     } 
    } 
} 
+0

Я понимаю это. Одна вещь, которую я не знаю, как в Factory метод 'Create' вернуть этот общий общий интерфейс ... – demo

+0

@demo проверить обновленный ответ. – Nkosi

Смежные вопросы