EF,ASP.NET MVC和StructureMap的依赖项注入问题

我知道关于结构图的这个问题还有一些类似的问题,但是我的问题似乎无法用他们需要的解决方案解决。我必须声明我已经多次使用相同的设置,但是看不到为什么这段代码会引起问题。

这里是我认为需要对我的代码进行故障排除所需的所有类。

ControllerConvention.cs

public class ControllerConvention : IRegistrationConvention
{
    public void ScanTypes(TypeSet types,Registry registry)
    {
        foreach (Type type in types.AllTypes())
        {
            if (type.CanBeCastTo(typeof(Controller)) && !type.IsAbstract)
            {
                registry.For(type).LifecycleIs(new UniquePerRequestLifecycle());
            }
        }
    }
}

IoC.cs

public static class IoC
{
    public static IContainer Container { get; set; }

    static IoC()
    {
        Container = new Container();
    }
}

StandardRegistry.cs

public class StandardRegistry : Registry
{
    public StandardRegistry()
    {
        Scan(scan =>
        {
            scan.TheCallingAssembly();
            scan.Assembly("PotSmart.Service");
            scan.Assembly("PotSmart.Data");
            scan.WithDefaultConventions();
        });
    }
}

StructureMapDependencyResolver.cs

 public class StructureMapDependencyResolver : IDependencyResolver
{
    private readonly Func<IContainer> _factory;

    public StructureMapDependencyResolver(Func<IContainer> factory)
    {
        _factory = factory;
    }

    public object GetService(Type serviceType)
    {
        if (serviceType == null)
        {
            return null;
        }

        var factory = _factory();



        return serviceType.IsAbstract || serviceType.IsInterface
            ? factory.TryGetInstance(serviceType)
            : factory.GetInstance(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return _factory().GetallInstances(serviceType).Cast<object>();
    }
}

Global.asax

 public IContainer Container
    {
        get
        {
            return (IContainer)HttpContext.Current.Items["_Container"];
        }
        set
        {
            HttpContext.Current.Items["_Container"] = value;
        }
    }

    protected void Application_Start()
    {


        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(Routetable.Routes);
        BundleConfig.RegisterBundles(Bundletable.Bundles);

        DependencyResolver.SetResolver(new StructureMapDependencyResolver(() => Container ?? IoC.Container));

        IoC.Container.Configure(cfg =>
        {
            cfg.AddRegistry(new StandardRegistry());
            cfg.AddRegistry(new ControllerRegistry());

        });


    }

这是我的数据和实体类的一部分:

RepositoryBase.cs

public class RepositoryBase 
{
    private readonly PotSmartEntityModel1 _dataContext;
    protected IDbFactory DbFactory { get; private set; }

    protected PotSmartEntityModel1 DbContext
    {
        get
        {
            return _dataContext ?? DbFactory.Init();
        }
    }

    protected RepositoryBase(IDbFactory dbFactory)
    {
        DbFactory = dbFactory;
        var adapter = (IObjectContextAdapter)this;
        var objectContext = adapter.ObjectContext;
        // objectContext.CommandTimeout = 120; // value in seconds
    }

}

public abstract class RepositoryBase<T> where T : class
{
    private readonly PotSmartEntityModel1 _dataContext;
    private readonly IDbSet<T> _dbSet;

    protected IDbFactory DbFactory { get; private set; }

    protected PotSmartEntityModel1 DbContext
    {
        get
        {
            return _dataContext ?? DbFactory.Init();
        }
    }

    protected RepositoryBase(IDbFactory dbFactory)
    {
        DbFactory = dbFactory;
        _dbSet = DbContext.Set<T>();
    }

    public virtual void Add(T entity)
    {
        _dbSet.Add(entity);
    }

    public virtual void Update(T entity)
    {
        _dbSet.Attach(entity);
        DbContext.Entry(entity).State = EntityState.Modified;
    }

    public virtual void Delete(T entity)
    {
        _dbSet.Remove(entity);
    }

    public virtual void Delete(Expression<Func<T,bool>> where)
    {
        IEnumerable<T> objects = _dbSet.Where<T>(where);
        foreach (T obj in objects)
        {
            _dbSet.Remove(obj);
        }
    }

    public virtual T GetById(int id)
    {
        return _dbSet.Find(id);
    }

    public virtual T GetById(string id)
    {
        return _dbSet.Find(id);
    }

    public virtual IEnumerable<T> Getall()
    {
        return _dbSet.ToList();
    }

    public virtual IEnumerable<T> GetMany(Expression<Func<T,bool>> where)
    {
        return _dbSet.Where(where).ToList();
    }

    public T Get(Expression<Func<T,bool>> where)
    {
        return _dbSet.Where(where).SingleOrDefault();
    }

    public virtual IQueryable<T> Query()
    {
        return _dbSet;
    }

    public virtual IQueryable<T> Query(Expression<Func<T,bool>> where)
    {
        return _dbSet.Where(where);
    }

    public virtual ObjectQuery<U> CreateQuery<U>(string query,ObjectParameter[] parameters)
    {
        return CastAsObjectContext().CreateQuery<U>(query,parameters);
    }

    public virtual ObjectQuery<U> CreateQuery<U>(string query)
    {
        return CreateQuery<U>(query,new ObjectParameter[0] { });
    }

    public virtual ObjectQuery<DbdataRecord> CreateQuery(string query,ObjectParameter[] parameters)
    {
        return CreateQuery<DbdataRecord>(query,parameters);
    }

    public virtual ObjectQuery<DbdataRecord> CreateQuery(string query)
    {
        return CreateQuery<DbdataRecord>(query);
    }

    private ObjectContext CastAsObjectContext()
    {
        var oContext = (DbContext as IObjectContextAdapter).ObjectContext;

        return oContext;
    }

}

DBFactory.cs

class DbFactory : Disposable,IDbFactory
{
    private PotSmartEntityModel1 _dbContext;

    public PotSmartEntityModel1 Init()
    {
        return _dbContext ?? (_dbContext = new PotSmartEntityModel1());
    }

    protected override void DisposeCore()
    {
        if (_dbContext != null)
        {
            _dbContext.Dispose();
        }
    }
}

IDBFactory.cs

public interface IDbFactory : IDisposable
{
    PotSmartEntityModel1 Init();
}

IRepository.cs

public interface IRepository
{
}


public interface IRepository<T> where T : class
{
    void Add(T entity);
    void Update(T entity);
    void Delete(T entity);
    void Delete(Expression<Func<T,bool>> where);
    T GetById(int id);
    T GetById(string id);

    IEnumerable<T> Getall();

    IEnumerable<T> GetMany(Expression<Func<T,bool>> where);

    IQueryable<T> Query();

    IQueryable<T> Query(Expression<Func<T,bool>> where);

    ObjectQuery<U> CreateQuery<U>(string query,ObjectParameter[] parameters);

    ObjectQuery<U> CreateQuery<U>(string query);

    ObjectQuery<DbdataRecord> CreateQuery(string query,ObjectParameter[] parameters);

    ObjectQuery<DbdataRecord> CreateQuery(string query);


}

现在,对这么多代码感到抱歉,但是那样一来,我就得到了社区中某些人可能会问的所有答案。问题出在我的控制器上,我不使用默认构造函数,并进行依赖项注入,如以下代码所示:

MarkerController.cs

public class MarkerController : Controller
{

    private readonly IMarkerService _markerService;

    public MarkerController(IMarkerService markerService)
    {
        _markerService = markerService;
    }

    // GET: Markers
    public actionResult Index()
    {
        return View();
    }

}

运行代码时,我不断收到以下错误,并尝试了我能想到的一切。

StructureMap.StructureMapConfigurationException:'未注册默认实例,并且无法自动确定类型'PotSmart.Data.Interfaces.IDbFactory'

我知道StructureMap并非总是具有最清晰的错误消息,但是我认为这意味着我的Entity模型由于某种原因未在运行时初始化。在“ factory.GetInstance(serviceType)”期间失败。有没有人遇到此错误,或者没有人看到我上面具有的代码集中明显忽略的东西会导致此问题?一如既往地感谢一百万。

petershi2009 回答:EF,ASP.NET MVC和StructureMap的依赖项注入问题

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2806963.html

大家都在问