C# 工厂中的输出类型

C# 工厂中的输出类型,c#,design-patterns,dependency-injection,factory,C#,Design Patterns,Dependency Injection,Factory,我有两个类-ModelBuilders:每个类用几乎相同的方法实现一个接口: public interface ICanBuildLocalListingsFacebookModel { Task<LocalListingsFacebookModel> BuildAsync(Guid userId, int folderId, DateTime? startDate, DateTime? endDate, Guid? companyId); } publi

我有两个类-
ModelBuilders
:每个类用几乎相同的方法实现一个接口:

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);
    }
目前,在工厂中,我有一个方法
Create
,它返回
dynamic
对象

这是因为我不能为2个接口创建一些公共类型

有什么好办法吗


我正在考虑创建一些公共接口,它将返回
Task
,在特定的接口中,只需使用关键字
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);
}
公共接口ICanBuildLocalListingsGoogleMyBusinessModel:ICanBuildLocalListingsModel
{
新任务BuildAsync(Guid userId,int folderId,DateTime?startDate,
日期时间?结束日期,Guid?公司ID);
}
公共接口构建LocalListingsModel
{
任务BuildAsync(Guid用户ID、int folderId、DateTime?startDate、,
日期时间?结束日期,Guid?公司ID);
}

有一个通用的模型库。可以是接口或抽象基类

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 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();
        }
    }
}
公共类InsightsModelFactory:FactoryBase{
私有只读词典策略;
专用只读IDbSessionManager dbSessionManager;
public InsightsModelFactory(IDbSessionManager dbSessionManager){
this.dbSessionManager=dbSessionManager;
策略=新字典();
//…填充可用的构建器或创建可注入的抽象。
}
公共重写IModelBuilder创建(LocalListingEngagement类型){
职能战略;
if(strategies.TryGetValue(type,out strategity)){
返回策略(dbSessionManager);
}否则{
抛出新的NotImplementedException();
}
}
}

有一个通用的模型库。可以是接口或抽象基类

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 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();
        }
    }
}
公共类InsightsModelFactory:FactoryBase{
私有只读词典策略;
专用只读IDbSessionManager dbSessionManager;
public InsightsModelFactory(IDbSessionManager dbSessionManager){
this.dbSessionManager=dbSessionManager;
策略=新字典();
//…填充可用的构建器或创建可注入的抽象。
}
公共重写IModelBuilder创建(LocalListingEngagement类型){
职能战略;
if(strategies.TryGetValue(type,out strategity)){
返回策略(dbSessionManager);
}否则{
抛出新的NotImplementedException();
}
}
}

我理解这一点。有一件事我不知道如何在工厂方法
Create
中返回这个通用接口…我理解这一点。有一件事我不知道如何在工厂方法
Create
中返回这个通用接口。。。