通用属性和IoC(Autofac)问题
我使用DI和IoC(Autofac)做了一个MVC 5项目,并使用Generic Repository作为数据访问部分。
现在,我的控制器有一个接口作为一个注入它的属性,称为IProg_II_ModelFactory
,这是所讨论的具体类:
public class Prog_II_ModelFactory : IProg_II_ModelFactory
{
#region Fields
private readonly IGenericRepository<T> _genericRepository;
#endregion
#region Ctor
public Prog_II_ModelFactory(
IGenericRepository<T> genericRepository
)
{
_genericRepository = genericRepository;
}
#endregion
#region Methods
public Prog_II_Model SetProgIIModelStartUp()
{
var model;
model.FillList = _genericRepository.GettAll();
//Other things to be filled.
return model;
}
}
而我的控制器正在注入这个类的接口,这里是控制器:
public class HomeController : Controller
{
private readonly IProg_II_ModelFactory _prog_II_ModelFactory;
public HomeController(
IProg_II_ModelFactory prog_II_ModelFactory
)
{
_prog_II_ModelFactory = prog_II_ModelFactory;
}
public ActionResult Index()
{
var model = _prog_II_ModelFactory.SetProgIIModelStartUp();
return View(model);
}
}
这个问题是Prog_II_ModelFactory
必须是通用的( Prog_II_ModelFactory<T> where T : class
)
问题在于,它不会在那里停下来,然后它会问我,控制器也应该是通用的,并且在使用Autofac的Im上,用于绑定的部分类也必须是通用的,并且也是App_Start本身! 。
有没有什么方法可以使用我的资源库的通用Interface
,而无需将TEntity
一直App_Start
?
我读过,我可以使用一种方法? 但很多人反对这一点。
编辑:
也许,而不是属性不是T,我必须输入它? 例如:
#region Fields
private readonly IGenericRepository<Student> _genericRepository_Student;
private readonly IGenericRepository<Teacher> _genericRepository_Teacher;
#endregion
#region Ctor
public Prog_II_ModelFactory(
IGenericRepository<Student> genericRepository_Student,
IGenericRepository<Teacher> genericRepository_Teacher
)
{
_genericRepository_Student = genericRepository_Student;
_genericRepository_Teacher = genericRepository_Teacher;
}
#endregion
这意味着我不能在运行时执行它,我必须知道在编译时哪个实体,如果我有20个表。
编辑2:
这是我的模特:
namespace Prog_II.Models
{
public class Prog_II_Model
{
#region Fields
public StudentModel Student{ get; set; }
public List<TurnModel> Turns{ get; set; }
public List<CarrerModel> Carrers { get; set; }
public List<StudentModel> Students{ get; set; }
#endregion
#region Ctor
public Prog_II_Model(){}
#endregion
}
public class StudentModel
{
#region Fields
public string Name { get; set; }
public string LastName{ get; set; }
public string NumberId { get; set; }
public string Carrer { get; set; }
public string Turn { get; set; }
#endregion
}
public class TurnModel
{
public string Description{ get; set; }
}
public class CarrerModel
{
public string Description{ get; set; }
}
}
在我看来,我确实通过了一个Prog_II_Model:
@using Prog_II.Models
@model Prog_II_Model
public HomeController(Prog_II_ModelRepository modelRepository)...
public class Prog_II_ModelRepository()
{
IGenericRepository<Student> _genericRepository_Student; // get from somewhere
public Prog_II_Model GetModel()
{
var model = new Prog_II_Model();
model.Student = _genericRepository_Student.Get(); // some student
// put the rest of data into your huge all-encompassing model
return model;
}
}
这只是一个想法 - 如果将所有数据放入单个模型对象中,类型特定的存储库在这个单一模型库中很有用,但它本身不需要是通用的(而不是通用的:)
我认为这个巨大模型方法有问题,但是YMMV。
您的HomeController是否应该处理多种实体类型(学生,教师,看门狗,狗,猫,...)? 你的模型是否足够灵活以处理所有和其中的任何一个? 如果是,请使用非通用的存储库接口,返回一个对象或一些基本实体类型。 如果不是,并且每个实体类型都有不同的模型(Dog的颜色和学生都有分数),那么您的域模型会要求每个实体类型的控制器,正如您所说,它是从一个通用控制器类型继承的。
我没有看到App_Start是通用的。
链接地址: http://www.djcxy.com/p/65673.html上一篇: Generic Property and IoC (Autofac) Issues
下一篇: HttpContext Session is null when using Dependency Injection