当前位置: 首页 > 知识库问答 >
问题:

Castle Windsor未创建/公开基类

弘伟彦
2023-03-14

在使用实体框架DbContext类型基类的存储库项目中,我有几个存储库类。

基类,基类

public class RepositoryBase<TC> : IDisposable
    where TC : DbContext, new()
{

    public virtual T Get<T>(...) where T : class
    {
        ...
    }

    // ... additional code
}

员工回购界面

namespace Insight.Repository.Interfaces
{
    public interface IEmployeeRepository
    {
        Result CreateEmployee(Employee employee);
        // ... additional code
    }
}

员工回购

namespace Insight.Repository.Repositories
{
    public class EmployeeRepository : RepositoryBase<InsightContext>, IEmployeeRepository
    {
        public Result CreateEmployee(Employee employee)
        {
            return Save(employee);
        }
    }
    // ... additional code
}

我正在将Repo类添加到Asp中的Windsor容器中。Mvc网站使用基于存储库项目内接口的安装程序。我在这里查看了容器,得到了三个存储库。

public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Classes.FromAssemblyNamed("Insight.Repository")
           .Where(Component.IsInNamespace("Insight.Repository.Repositories"))
            .WithService.DefaultInterfaces()
            .LifestyleTransient());
    }

我尝试注册DbContext,如下所示,但得到了相同的结果。

container.Register(Component.For<DbContext>()
            .ImplementedBy<InsightContext>()
            .LifestyleTransient());

然后,在我的ApiController中,我使用Property注入来实例化Repo类,但我无法访问任何基类函数。

public class EmployeeController : ApiController
{
    public IEmployeeRepository EmployeeRepo { get; set; }

    [Route("GetEmployee")]
    public void Get()
    {
        var newEmployeeRepo = new EmployeeRepository();
    }
}

EmployeeRepo无权访问基类中的Get()函数,但newEmployeeRepo有权访问。

这是我第一个使用Castle的项目。温莎和我显然错过了一些注册步骤,但可以找到答案。

如果有人能给我指出正确的方向,我将不胜感激。

编辑:使用tym32167提供的Linqpad代码进行测试

void Main()
{
    var container = new WindsorContainer();

    var type = typeof(II);
    container.Register(Classes.FromAssembly(type.Assembly)
       .Where(Component.IsInNamespace(type.Namespace))
        .WithService.AllInterfaces()
        .LifestyleTransient());

    var cls = container.Resolve<II>().Dump();
    cls.GetFirstName().Dump();
    cls.GetLastName().Dump();
}

public interface II
{
    string GetFirstName();
}

public class MyClass : II
{
    public string GetFirstName()
    {
    return "First Name";
    }

    public string GetLastName()
    {
    return "Last Name";
    }
}

代码在此行中断:

cls.GetLastName().Dump();

这是预期的行为吗?

共有2个答案

聂炜
2023-03-14

尝试替换

.WithService.DefaultInterfaces()

.WithService.AllInterfaces()

作为样本(刚刚与linqpad核对)

void Main()
{   
    var container = new WindsorContainer();

    var type = typeof(II);
    container.Register(Classes.FromAssembly(type.Assembly)
           .Where(Component.IsInNamespace(type.Namespace))
            .WithService.AllInterfaces()
            .LifestyleTransient());

    container.Resolve<II>().Dump();
}

public interface II
{
}

public class MyCl : II
{
}
关翰
2023-03-14

要访问基类上的方法,您需要有一个基本接口:)

public interface IBaseRepo<T>
{
     T Get(int id);
     // ...
}

public interface IEmployeeRepo : IBaseRepo<Employee>
{
     Employee GetByFirstName(string name);
     // ...
}

请注意子接口如何继承基接口。因此,任何实现IEmployeeRepo的类型都保证它也实现了IBaseRepo

您在基类中实现了基本存储库,您的具体员工存储库继承了这个事实,这只是客户端代码不应该关心的一个实现细节——现在它不关心了!

 类似资料:
  • 问题内容: 我在Docker中设置了一个简单的节点服务器。 Docker文件 example.js 现在建立图像 现在在容器中运行 验证容器正在运行并且端口已映射: 现在,让我们附加到容器并验证服务器是否在其中运行: 并在容器命令行中输入: 看起来不错吧? 问题 当我在主机上执行相同的curl命令(或使用浏览器导航到http:// localhost:1337 )时,什么都看不到。 知道为什么容器

  • 问题内容: 这是错误: 这是导致问题的代码区域。 该错误是什么意思,需要做些什么才能修复上面的代码? 问题答案: 你要: 将 每个方括号 转义 两次 -对于需要从其特殊含义中删除它们的每种上下文一次:一次在 正则表达式中 ,然后在 Java String中 。 当您需要对 整个模式 进行 字面 解释时,请考虑使用。 说明 有工作 正则表达式 ,但并没有标准字符,正则表达式明智的:他们在这方面有特殊

  • 问题内容: 以下小测试将引发NPE: 但是,compareTo()的Javadoc 并未提及该参数不能为。这很奇怪,因为Javadocs通常会提到何时参数不能为。 这仅仅是文档中的一个小故障,还是我想念的更根本的原因/扭曲? 问题答案: 查看Comparable接口时,您可以得到一些解释: 请注意,null不是任何类的实例,即使e.equals(null)返回false,e.compareTo(n

  • 我正在尝试使用Exposed on Kotlin编写CRUD服务。我有一张多对一的参考表。当我尝试插入时,我得到 Java语言lang.IllegalStateException:上下文中没有事务。 这是表和实体 下面是用于创建的服务方法 保存实体后调用toContact()方法时引发错误 var contact=contactEntity。toContact() 创建此类实体的正确方法是什么?

  • 我想运行一些本机查询,并通过endpoint公开结果,但我想这样做,而不必创建所有实体。我只希望从数据库中获得的数据在出现时公开。 我在网站上找到了一些建议:创建没有实体的spring存储库 然而,我没能让它们工作。我对Spring很陌生。 我试过Maciej Kowalski的解决方案如下: 接口: 实施: 然而,没有暴露endpoint,就像扩展CrudRepository时发生的那样。我应该

  • 我有一个使用log4j1的应用程序。我在log4j.properties中的配置工作正常,它为日志创建文件。 我迁移到log4j2,现在没有创建文件,尽管我遵循了文档。我在这里尝试了所有不同的解决方案,但我无法实现。 这是我的应用程序中的log4j2.xml内部资源 这是我pom.xml的依赖 我厌倦了用完整路径更改文件的路径,在权限问题时更改文件夹。 我没有任何错误,但是当应用程序运行时,我看不