在使用实体框架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();
这是预期的行为吗?
尝试替换
.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
{
}
要访问基类上的方法,您需要有一个基本接口:)
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的依赖 我厌倦了用完整路径更改文件的路径,在权限问题时更改文件夹。 我没有任何错误,但是当应用程序运行时,我看不