存储库作为参数

时间:2016-07-04 14:07:20

标签: c# asp.net-mvc linq repository-pattern unit-of-work

我创建了一个通用下拉列表,用于我的控制器:

GenericDropDownList("myDropDown");

    private void GenericDropDownList(string dropdownName, object selectedDepartment = null) {

    var dropdownQuery = unitOfWork.SalesRepository.Get(orderBy: q => q.OrderBy(d => d.FirstName));

    ViewData[dropdownName] = new SelectList(dropdownQuery, "LastName", "LastName", selectedDepartment);
    }

这似乎工作正常。我尝试的是使unitOfWork.TestRepository动态,以便我可以使用函数中的每个可用存储库:

GenericDropDownList("myDropDown", SalesRepository);

    private void GenericDropDownList(string dropdownName, object repository, object selectedDepartment = null) {

    var dropdownQuery = repository.Get(orderBy: q => q.OrderBy(d => d.FirstName));

    ViewData[dropdownName] = new SelectList(dropdownQuery, "LastName", "LastName", selectedDepartment);
    }

上述方法无效。我收到以下错误:

  

错误CS1061'对象'不包含' Get'的定义和不   扩展方法'获取'接受类型'对象'的第一个参数。   可以找到

是否可以将下拉列表视为我想要的动态?

3 个答案:

答案 0 :(得分:0)

如果您想要动态对象,请使用dynamic类型。

或者尝试将其转换为合适的类型:

(repository as type).Get(...)

答案 1 :(得分:0)

正确的方法是让所有存储库都使用常用方法实现公共接口。

例如,您可以创建界面IRepositoryIRepository<TSource>,如果您希望它更具体一点。

问题是TSource应根据您的预期代码设置FirstName属性。

您确定所有存储库都有FirstName属性的实体吗?

如果答案是,那么你就无法创建这样的通用方法(你需要重新定义你的逻辑,或创建一个具有此属性的实体的特定接口,但是你无法传递任何存储库,只传递实现此接口的存储库。)

如果答案是,那么您可以为所有源实体(例如BaseEntity)创建基类,这将具有FirstName财产。

假设答案是肯定的,那么您可以将方法的签名更改为:

private void GenericDropDownList(string dropdownName, IRepository<TSource> repository, object selectedDepartment = null) where TSource : BaseEntity

然后您就可以调用它:

GenericDropDownList("myDropDown", SalesRepository); //SalesRepository should implement IRepository<Sale>, where Sale : BaseEntity

答案 2 :(得分:0)

app.log.lck没有app.log.1方法,因此无法编译它。

使用FileHandler将解决这个问题,因为object会在运行时解析,虽然性能成本很高,如果在运行时不存在.Get,则存在运行时错误的风险。< / p>

我认为最好的方法是使用界面:

dynamic

使用Entity Framework时,可以使用分部类将此接口强加于Repository类:

.Get

一个问题是接口可以定义.Get等属性,因此您必须为此定义方法,或使用private void GenericDropDownList(string dropdownName, IRepository repository, object selectedDepartment = null) { // ... } 排序位。