我遇到了Castle.Windsor依赖注入问题。 我想在容器中注册所有我的服务层与相关的Dao。我也想获得Propery Injection而不是Constructor注入。当我运行以下代码时,我总是发现我的Dao对象为null。当然我在容器注册上做错了。我已经阅读并尝试了许多我在网上找到的没有结果的解决方案。
服务示例:
public class DummyBLL : IDummyBLL
{
public IDelegaDao delegaDao { get; set; }
public IUtenteDao utenteDao { get; set; }
public IFunzioneDao funzioneDao { get; set; }
public void dummyMethod(String key)
{
//Business logic that make use of the dao objects
}
...
}
Dao示例:
public class BaseDao<T> : BaseDao where T : Entita
{
public BaseDao()
{
Session = NHibernateHelper.CurrentSession;
}
public BaseDao(ISession session)
{
this.Session = session;
}
}
public class BaseDao
{
public ISession Session { get; protected set; }
public BaseDao()
{
SearchFields = new List<string>();
Session = NHibernateHelper.CurrentSession;
}
public BaseDao(ISession session)
{
if (session != null)
{
Session = session;
}
else
{
Session = NHibernateHelper.CurrentSession;
}
SearchFields = new List<string>();
}
}
public interface IFunzioneDao
{
IEnumerable<COGE.Business.ObjectModel.Funzione> CercaFunzioniPerUtente(Guid idUtente);
IEnumerable<COGE.Business.Data.Dto.FunzioneDto> GetAllFunzioni();
}
public class FunzioneDao : BaseDao<Funzione>, IFunzioneDao
{
public FunzioneDao() { }
public FunzioneDao(ISession session): base(session){}
public IEnumerable<FunzioneDto> GetAllFunzioni()
{
var funzioni = Session.QueryOver<Funzione>()
.OrderBy(x => x.Categoria).Asc
.ThenBy(x => x.Descrizione).Asc
.List();
return funzioni.Select(x => x.ToDto());
}
public class TgcppdcDao : BaseDao, ITgcppdcDao
{
private IDbConnection connessione = null;
private ISession session = null;
private static readonly ILog Log = LogManager.GetLogger(typeof(TgcppdcDao));
public TgcppdcDao()
{
}
public TgcppdcDao(ISession session)
: base(session)
{
}
我有一些需要继承通用基类的dao和需要非通用基类的其他dao。
要在容器中注册,我正在执行以下操作:
// service registration
container.Register(Classes.FromAssemblyNamed("COGE.Business").InNamespace("COGE.Business.BLL").WithServiceFirstInterface().LifestyleTransient());
//to register the non generic dao
container.Register(Classes.FromAssemblyNamed("COGE.Business").BasedOn(typeof(BaseDao<>)).WithServiceAllInterfaces().LifestyleTransient());
//to register generic dao
container.Register(Classes.FromAssemblyNamed("COGE.Business").BasedOn(typeof(IBaseGenericDao<>)).WithServiceAllInterfaces().LifestyleTransient());
我对非泛型dao没有问题,但注射不适用于泛型dao。
我该如何解决这个问题?
提前致谢。
答案 0 :(得分:0)
我的猜测与继承有关......“Generic Dao”继承自“非泛型Dao”......可能(没试过)创造流畅的注册混淆...... 由于继承,第一次注册也可以注册通用daos ...
还要注意WithServiceAllInterfaces,通常DefaultInterfaces就足够了
我宁愿为所有存储库使用通用接口。 IRepository,其中T:Entity:尝试正确实现存储库模式,而不是一次性注册所有daos /存储库
Classes.FromAssemblyNamed( “COGE.Business”) .BasedOn(typeof运算(IRepository&LT;&GT)) .WithService.DefaultInterfaces()。LifestyleTransient()
我没有在代码中看到泛型dao ...你没有利用泛型dao / repository模式。