如何使用AutoMapper DestinationType定义和使用存储库?

时间:2015-06-01 18:51:22

标签: asp.net-mvc generics asp.net-web-api automapper

我正在尝试减少现有MVC 4 Web API 2应用程序中的重复代码。我们使用AutoMapper将实体映射到自定义DataObjects。我们有一个现有的数据库,其中包含多个与特定产品相关的“标签”表(比如说自行车,沙发和桌子)。

我有一个通用控制器:

public class TagController<TTagDataObject> : ApiController where TTagDataObject : ITagDataObject
{
    private readonly ITagService<TTagDataObject> _service;

    public TagController(ITagService<TTagDataObject> service)
    {
        _service = service;
    }

    [HttpPost]
    public HttpResponseMessage Post(TTagDataObject model)
    {
        if (!ModelState.IsValid)
        {
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ModelState);
        }

        // Make service call
        model = _service.CreateTag(model);

        return Request.CreateResponse(HttpStatusCode.Created, model);
    }
... Other Methods
}

应用程序正在使用Repository Pattern,我在创建服务时遇到了麻烦,因为我需要按实体类型定义Repository,而我只知道DataObject类型。 我可以使用AutoMapper的GetAllTypeMaps()

获取实体类型
System.Type t = Mapper.GetAllTypeMaps().FirstOrDefault(i=> i.SourceType == typeof(TTagDataObject)).DestinationType;

如何定义和使用存储库?我想做点什么:

Repository<t> repository = new Repository<t>();

但我得到“找不到类型或名称空间''......”

我可以使用Activator CreateInstance方法定义存储库,如下所示:Pass An Instantiated System.Type as a Type Parameter for a Generic Class

var repository = Activator.CreateInstance(t);

但是除非我使用反射或动态,否则我无法访问存储库方法。似乎应该有一个更简单的解决方案,并且我可能会以错误的方式解决这个问题。

非常感谢。

0 个答案:

没有答案