在Windsor注册组件需要澄清

时间:2014-10-16 04:34:53

标签: c# .net asp.net-mvc castle-windsor ioc-container

根据documentation我正在尝试注册我所有的IRepository实现,以便在控制器中进一步注入:

        container.Register(
            Classes.FromThisAssembly()
                .BasedOn<IRepository>()
                .WithService.Base()
                .LifestyleTransient());

具体的存储库实例的使用很简单:

public class TheController : Controller
{
    private MyConcreteRepository repo;


    public TheController (MyConcreteRepository r)
    {
        repo = r;
    }


    public ActionResult Index()
    {
        var ans = repo.GiveMeData<TheDataType>();
        ...
        ...
        return View();
    }
}

启动应用程序它会抛出

'MyMVCWebSite.Controllers.TheController' is waiting for the following dependencies:
- Service 'MyMVCWebSite.DataUtils.MyConcreteRepository' which was not registered.

存储库层次结构类似于

public interface IRepository : IDisposable
{
    ...
}


public interface IAlmostConcreteRepository : IRepository
{
    DbSet<TEntity> GiveMeData<TEntity>() where TEntity : class;
}


public class MyConcreteRepository : IAlmostConcreteRepository 
{
    protected DbContext context;

    public MyConcreteRepository(DbContext dbc)
    {
        context = dbc;
    }

    public DbSet<TEntity> GiveMeData<TEntity>() where TEntity : class 
    {
        return context.Set<TEntity>();
    }

    ...

    public void Dispose()
    {
        ...
    }
}

所以registering components one-by-one

都没有
        container.Register(
            Component.For<IAlmostConcreteRepository>()
            .ImplementedBy<MyConcreteRepository>()
            .LifestyleTransient());

也不是按照在帖子开头提到的惯例做到这一点不起作用。 只能注册具体实例:

        container.Register(
            Component.For<MyConcreteRepository>()
            .LifestyleTransient());

        container.Register(
            Classes.FromThisAssembly()
                .BasedOn(typeof(MyConcreteRepository))
                .WithService.Base()
                .LifestyleTransient());

我是否遗漏了文档中的内容?请帮忙。

1 个答案:

答案 0 :(得分:1)

这里我使用了MyConcreteRepository类而不是接口,所以这就是问题所在。

public class TheController : Controller
{
    private MyConcreteRepository repo;


    public TheController (MyConcreteRepository r)
    {
        repo = r;
    }
}

简单拼写错误,应该是:

public class TheController : Controller
{
    private IAlmostConcreteRepository repo;


    public TheController (IAlmostConcreteRepository r)
    {
        repo = r;
    }
}