gpt4 book ai didi

c# - PRISM:RegisterType 给出隐式引用转换错误

转载 作者:行者123 更新时间:2023-12-05 07:46:14 25 4
gpt4 key购买 nike

我的解决方案中有三个项目。

一个拿着界面:

public interface ISetupData
{
Dictionary<string, string> Data { get; set; }
}

接口(interface)的另一个实现:

public class SetupData : ISetupData
{
public Dictionary<string, string> Data { get; set; }
}

第三种同时使用:

Container.RegisterType<ISetupData, SetupData>();

我已经在项目中设置了引用,所以一切都被识别了。但是当我编译时出现错误:

类型 SetupData 不能用作泛型类型或方法“Microsoft.Practices.Unity.UnityContainerExtensions.RegisterType(Microsoft.Practices.Unity.IUnityContainer, params Microsoft.Practices.Unity.InjectionMember[]”中的类型参数“TTo” )'。不存在从 SetupData 到 ISetupData 的隐式引用转换。

如果我将接口(interface)的声明放入接口(interface)实现的项目中,它就可以正常工作。

我不知道这个错误是什么意思。谁能帮忙?

最佳答案

所以我有以下内容,它适用于从我的数据库上下文中获取报告数据 - 我已将其简化为我认为您可能感兴趣的部分:

UnityConfig

using System;
using Microsoft.Practices.Unity;
using WeeklyReport.Repository;
using System.Web.Mvc;
using Unity.Mvc3;

namespace WeeklyReport
{
public class UnityConfig
{
public static void RegisterContainer()
{
var container = new UnityContainer();

//ensure the repository is disposed after each request by using the lifetime manager
container.RegisterType<IDataRepository, DataRepository>(new HierarchicalLifetimeManager());

DependencyResolver.SetResolver(new UnityDependencyResolver(container));

}
}
}

IDataRepository

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using WeeklyReport.Models;

namespace WeeklyReport.Repository
{
public interface IDataRepository
{
IEnumerable<ReportViewModel> GetAllMetrics();
}
}

和我的Repository 类:

using System;
using System.Collections.Generic;
using System.Linq;
using WeeklyReport.Models;

namespace WeeklyReport.Repository
{
public class DataRepository : IDataRepository
{
// ....
public IEnumerable<ReportViewModel> GetAllMetrics()
{
// ....
}
}
}

然后我实例化 private readonly IDataRepository repository;在我的 Controller 中,我可以调用 repository.GetAllMetrics()在将数据返回到我的 View 的函数中。

可能不言而喻,但希望您添加了 NuGet 包 Unity

我最初遇到了与您相同的错误,因为我忘记添加 : IDataRepository在我的 DataRepository 类上,这意味着我没有继承 IDataRepository .我发现这不是您的问题,但这就是错误的含义 - 它意味着关系未建立并且接口(interface)找不到其底层协变( ISetupData 找不到 SetupData )。

我没有看到你创建了一个 UnityContainer , 但正在调用 Container直接,而不是。可能不是最佳做法。然后你需要做 DependencyResolver.SetResolver(new UnityDependencyResolver(container)); .我建议创建 UnityContainer 的实例, 不直接调用 Container .

你说“把接口(interface)的声明放到接口(interface)实现的工程中”就可以了?抱歉,那太令人困惑了,我不知道你的意思。

我不明白你为什么要这样做{ get; set; }在两侧。一个应该是另一个的实现,而你有 Dictionary , 不是 IDictionary .它应该是这样的:

public interface ISetupData
{
IDictionary<string, string> Data;
}

实例化后private readonly ISetupData myData;你应该可以使用 myData.Data意思是SetupData .

所以我认为如果你使用它,并且这样做:

using System;
using Microsoft.Practices.Unity;
using WeeklyReport.Repository;
using System.Web.Mvc;
using Unity.Mvc3;

namespace WeeklyReport
{
public class UnityConfig
{
public static void RegisterContainer()
{
var container = new UnityContainer();

//ensure the repository is disposed after each request by using the lifetime manager
container.RegisterType<ISetupData, SetupData>(new HierarchicalLifetimeManager());

DependencyResolver.SetResolver(new UnityDependencyResolver(container));

}
}
}

只要您的 Global.ascx.csUnityConfig.RegisterContainer();,您就应该没问题在App_Start部分。

关于c# - PRISM:RegisterType 给出隐式引用转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40976760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com