【问题标题】:What must I do to have my Interface be at least as accessible as the method in which it is referenced?我必须做些什么才能让我的接口至少与引用它的方法一样可访问?
【发布时间】:2014-01-12 04:40:48
【问题描述】:

我正在尝试将我的控制器转换为使用 DI。

基于article here,我现在得到了这个代码:

namespace HandheldServer.Controllers
{
    public class DuckbillsController : ApiController
    {
        static IDuckbillRepository _platypiRepository;

        public DuckbillsController(IDuckbillRepository platypiRepository)
        {
            if (platypiRepository == null)
            {
                throw new ArgumentNullException("platypiRepository is null");
            }
            _platypiRepository = platypiRepository;
        }

        public int GetCountOfDuckbillRecords()
        {
            return _platypiRepository.Get();
        }

        public IEnumerable<Duckbill> GetBatchOfDuckbillsByStartingID(int ID, int CountToFetch)
        {
            return _platypiRepository.Get(ID, CountToFetch);
        }

        public void PostDuckbill(int accountid, string name)
        {
            _platypiRepository.PostDuckbill(accountid, name);
        }

        public HttpResponseMessage Post(Duckbill Duckbill)
        {
            Duckbill = _platypiRepository.Add(Duckbill);
            var response = Request.CreateResponse<Duckbill>(HttpStatusCode.Created, Duckbill);
            string uri = Url.Route(null, new { id = Duckbill.Id });
            response.Headers.Location = new Uri(Request.RequestUri, uri);
            return response;
        }
    }
}

...但它不能编译;我得到了,“可访问性不一致:参数类型 'HandheldServer.Models.IDuckbillRepository' 比方法 'HandheldServer.Controllers.DuckbillsController.DuckbillsController (HandheldServer.Models.IDuckbillRepository)'更难访问

err msg中提到的接口参数类型为:

using System.Collections.Generic;

namespace HandheldServer.Models
{
    interface IDuckbillRepository
    {
        int Get();
        IEnumerable<Duckbill> Get(int ID, int CountToFetch);
        Duckbill Add(Duckbill item);
        void Post(Duckbill dept);
        void PostDuckbill(int accountid, string name);
        void Put(Duckbill dept);
        void Delete(int Id);
    }
}

我需要做什么来解决这个错误消息?

【问题讨论】:

    标签: c# interface dependency-injection asp.net-web-api inversion-of-control


    【解决方案1】:

    您需要将interface 明确标记为public

    public interface IDuckbillRepository
    {
        // ....
    }
    

    另外,不要在 Controller 中将其标记为 static

    【讨论】:

    • 文章中是静态的。
    • 不应该。假设存储库设置正确..它应该在每个请求上重新创建..就像你的控制器一样。静态属性将在应用程序域的整个生命周期中存在。如果存储库是在“每个请求”生命周期中设置的(应该是这样)。那么您向控制器抛出的请求越多,您可能会遇到随机错误.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 2019-06-18
    • 1970-01-01
    相关资源
    最近更新 更多