Castle windsor - 具有依赖关系的null对象注入继承自泛型基类的类

时间:2013-06-28 13:44:27

标签: c# generics dependency-injection castle-windsor ioc-container

我遇到了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。

我该如何解决这个问题?

提前致谢。

1 个答案:

答案 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模式。