通用属性和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