Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的Funq容器不能正常工作?_C#_Asp.net Mvc_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack - Fatal编程技术网 servicestack,C#,Asp.net Mvc,servicestack" /> servicestack,C#,Asp.net Mvc,servicestack" />

C# 为什么我的Funq容器不能正常工作?

C# 为什么我的Funq容器不能正常工作?,c#,asp.net-mvc,servicestack,C#,Asp.net Mvc,servicestack,当我的代码试图访问数据库时,我得到一个空引用异常 这是在global.asax中,我已经通过了调试器,并且正在执行这段代码 public class MvcApplication : System.Web.HttpApplication { public class DmsAppHost : AppHostBase { public DmsAppHost() : base("API", typeof(AppUsersService).Assembly) { }

当我的代码试图访问数据库时,我得到一个空引用异常

这是在global.asax中,我已经通过了调试器,并且正在执行这段代码

public class MvcApplication : System.Web.HttpApplication
{
    public class DmsAppHost : AppHostBase
    {
        public DmsAppHost() : base("API", typeof(AppUsersService).Assembly) { }

        public override void Configure(Funq.Container container)
        {
            var dbConnectionFactory = new OrmLiteConnectionFactory("Server=localhost;Port=5432;User Id=dms; Password=dms; Database=dms", PostgreSqlDialect.Provider);
            container.Register<IDbConnectionFactory>(dbConnectionFactory);
            container.RegisterAutoWiredAs<AppUserRepository, IAppUserRepository>();
        }
    }

    protected void Application_Start()
    {
        new DmsAppHost().Init();

        AreaRegistration.RegisterAllAreas();

        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BootstrapSupport.BootstrapBundleConfig.RegisterBundles(System.Web.Optimization.BundleTable.Bundles);
    }

}
公共类MVCAPApplication:System.Web.HttpApplication
{
公共类DmsAppHost:AppHostBase
{
public DmsAppHost():base(“API”,typeof(AppUsersService.Assembly){}
公共覆盖无效配置(Funq.Container)
{
var dbConnectionFactory=new或mliteconnectionfactory(“服务器=localhost;端口=5432;用户Id=dms;密码=dms;数据库=dms”,postgresqldialdial.Provider);
容器注册(dbConnectionFactory);
container.RegisterAutoWiredAs();
}
}
受保护的无效应用程序\u Start()
{
新的DmsAppHost().Init();
RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BootstrapSupport.BootstrapBundleConfig.RegisterBundles(System.Web.Optimization.BundleTable.Bundles);
}
}
当我点击这段代码(使用(var db=DbConnectionFactory.OpenDbConnection())时,我得到了一个NullReferenceException

对象引用未设置为对象的实例

public class AppUserRepository : IAppUserRepository
{
    public IDbConnectionFactory DbConnectionFactory { get; set; }

    public AppUser GetAppUserByUsername(string username)
    {
        AppUser appUser;
        using (var db = DbConnectionFactory.OpenDbConnection())
        {
            appUser = db.QuerySingle<AppUser>(new { username });
        }
        return appUser;
    }
}
公共类AppUserRepository:IAppUserRepository
{
公共IDbConnectionFactory DbConnectionFactory{get;set;}
公共AppUser GetAppUserByUsername(字符串用户名)
{
AppUser-AppUser;
使用(var db=DbConnectionFactory.OpenDbConnection())
{
appUser=db.QuerySingle(新的{username});
}
返回appUser;
}
}

我是要假设我的连接有问题,还是有什么事情我做得不对以使Funq正常工作?

您没有展示您的resolve
IAppUserRepository
,但是使用Funq,您必须在注册抽象时在factory委托实例中进行任何项目注入


有关更多信息,请参阅。

告诉容器如何使用以下配置解析
IAppUserRepository

container.RegisterAutoWiredAs()


RegisterAutoWiredAs
将注入
IDbConnectionFactory
依赖项

您的问题是
DbConnectionFactory
未成为对象,因此它仍然为空

好像你会这么做

public TextBlock nullBlock; // it's your public IDbConnectionFactory DbConnectionFactory { get; set; }
nullBlock.Text;             //           DbConnectionFactory.OpenDbConnection()
您需要设置一个对象

就你的情况来说

var obj = new AppUserRepository();
obj.DbConnectionFactory = .... //
如果您在某些隐藏代码中填充它,则会增加

您应该这样做,并设置一个断点,也许您的悬置对象为空

private IDbConnectionFactory _dbConnectionFactory
public IDbConnectionFactory DbConnectionFactory 
{
      get {return _dbConnectionFactory; }
      set {_dbConnectionFactory=value;}
}

您已经展示了一些Funq容器配置,它将依赖项注入到您的
AppUserRepository
类中。但是您还没有展示如何以及在哪里使用这个类。由于您的问题被标记为
asp.net mvc
,我假设这发生在asp.net mvc控制器操作中。大致如下:

public class HomeController: Controller
{
    private readonly IAppUserRepository repo;
    public HomeController(IAppUserRepository repo)
    {
        this.repo = repo;
    }

    public ActionResult Index(int id)
    {
        var model = this.repo.Get(id);
        return View(model);
    }
}
如果您想在ASP.NET MVC中使用依赖项注入框架,则必须编写一个自定义框架,该框架将注入控制器

让我们继续为Funq写一篇:

public class FunqDependencyResolver : IDependencyResolver
{
    private readonly ContainerResolveCache cache;
    public FunqDependencyResolver(Container container)
    {
        this.cache = new ContainerResolveCache(container);
        var controllerTypes =
            (from type in Assembly.GetCallingAssembly().GetTypes()
             where typeof(IController).IsAssignableFrom(type)
             select type).ToList();
        container.RegisterAutoWiredTypes(controllerTypes);
    }

    public object GetService(Type serviceType)
    {
        return this.cache.CreateInstance(serviceType, true);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return Enumerable.Empty<object>();
    }
}
另外,我建议您对
AppUserRepository
类使用构造函数注入,因为
DbConnectionFactory
是该类正常工作所必需的依赖项:

public class AppUserRepository : IAppUserRepository
{
    private readonly IDbConnectionFactory dbConnectionFactory;
    public class AppUserRepository(IDbConnectionFactory dbConnectionFactory)
    {
        this.dbConnectionFactory = dbConnectionFactory;
    }

    public AppUser GetAppUserByUsername(string username)
    {
        AppUser appUser;
        using (var db = this.dbConnectionFactory.OpenDbConnection())
        {
            appUser = db.QuerySingle<AppUser>(new { username });
        }
        return appUser;
    }
}
公共类AppUserRepository:IAppUserRepository
{
私有只读IDbConnectionFactory dbConnectionFactory;
公共类AppUserRepository(IDbConnectionFactory dbConnectionFactory)
{
this.dbConnectionFactory=dbConnectionFactory;
}
公共AppUser GetAppUserByUsername(字符串用户名)
{
AppUser-AppUser;
使用(var db=this.dbConnectionFactory.OpenDbConnection())
{
appUser=db.QuerySingle(新的{username});
}
返回appUser;
}
}

我也尝试过使用SqlLite,但也遇到了同样的问题。Funq似乎没有创建我的DbConnectionFactory的实例。这里您调用的是
DbConnectionFactory.OpenDbConnection()
我看不出您实际在哪里创建连接
我是否忽略了这里的某些内容它应该由上面global.asax文件中的Funq(IOC容器)处理。至少我是这样理解它的。你能用你最新的代码示例更新吗?现在很难说事情在哪里。是不是因为IoC容器只适用于服务中出现的那些实例,而且因为我在存储库中使用它,而不是通过服务使用它,所以它就不起作用了?我添加了这一点,但当它在AppUserRepository.GetAppUserByUsername(“用户”)的代码中出现时然后我还得到一个空引用异常。您在服务中的依赖关系是针对接口还是具体类型的?我在服务公共IAppUserRepository AppUserRepository{get;set;}中有此项
public class AppUserRepository : IAppUserRepository
{
    private readonly IDbConnectionFactory dbConnectionFactory;
    public class AppUserRepository(IDbConnectionFactory dbConnectionFactory)
    {
        this.dbConnectionFactory = dbConnectionFactory;
    }

    public AppUser GetAppUserByUsername(string username)
    {
        AppUser appUser;
        using (var db = this.dbConnectionFactory.OpenDbConnection())
        {
            appUser = db.QuerySingle<AppUser>(new { username });
        }
        return appUser;
    }
}