I have such interface:
public interface IImportModel
{
}
And class which implements this interface:
public class MaterialImportModel: IImportModel
{
public string Name { get; set; }
}
Also I have interface for processors of import:
public interface IImportProcessor<TModel> where TModel: IImportModel
{
void Process(TModel model);
}
And there is one of implementation of this interface:
public class MaterialImportProccessor : IImportProcessor<MaterialImportModel>
{
public void Process(MaterialImportModel model)
{
// do some logic here
}
}
Now I want to create Factory to instantiate such kind of processors. I have interface:
public interface IImportProcessorFactory
{
IImportProcessor<IImportModel> Get(Parameter parameter);
}
And I'm trying to create implementation:
public class ImportProcessorFactory : IImportProcessorFactory
{
public IImportProcessor<IImportModel> Get(Parameter parameter)
{
switch (Parameter)
{
case "Materials":
IImportProcessor<IImportModel> processor = new MaterialImportProccessor();
return processor;
case "Companies":
IImportProcessor<IImportModel> processor = new CompaniesImportProccessor();
return processor;
}
}
}
But I got exception:
Error CS0266 Cannot implicitly convert type 'MaterialImportProccessor' to
IImportProcessor<IImportModel>
. An explicit conversion exists (are you missing a cast?)
It's correct. But I can't use out
keyword to make IImportProcessor
covariance because I use TModel
as input parameter of Process(TModel method)
method.
Are there any ways to refactor this code to make it work?
EDITED
I decided to give additional information about how I plan to use this factory.
var deserializer = _deserializerFactory.Get(/*some parameters*/);
var importProcessor = _importProcessorFactory.Get(someEunmValue);
var data = deserializer.Deserialize(file);
importProcessor.Process(data);
Because of it I can't make import processor factory generic.