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
中返回这个通用接口。。。