C#使用接口访问方法

C#使用接口访问方法,c#,interface,C#,Interface,我在“repository”和“services”中有一些接口和类,并且说如果我要使用FindBy方法,我将在IUserService中调用FindBy方法,这将最终在UserRepository中的FindBy方法中结束。接口和类如下所示: public interface IUserService { User FindBy(string userName); SimpleResult Insert(User user); } public class UserServic

我在“repository”和“services”中有一些接口和类,并且说如果我要使用FindBy方法,我将在IUserService中调用FindBy方法,这将最终在UserRepository中的FindBy方法中结束。接口和类如下所示:

public interface IUserService
{
    User FindBy(string userName);
    SimpleResult Insert(User user);
}

public class UserService : IUserService
{
    private readonly IUserRepository userRepository;

    public UserService(IUserRepository _userRepository)
    {
        userRepository = _userRepository;
    }

    public User FindBy(string userName)
    {
        return userRepository.FindBy(userName);
    }

    public SimpleResult Insert(User user)
    {
        return userRepository.Insert(user);
    }
}

public interface IUserRepository
{
    SimpleResult Delete(User user);
    IList<User> FindAll();
    User FindBy(long userID);
    User FindBy(string userName);
    SimpleResult Insert(User user);
    SimpleResult Update(User user);
}

public class UserRepository : IUserRepository
{
    Entities db = new Entities();
    public User FindBy(long userID)
    {
        return db.Users.Where(x => x.UserID == userID).FirstOrDefault();
    }

    public SimpleResult Insert(User user)
    {
        SimpleResult result = new SimpleResult();

        try
        {
            db.Users.Add(user);
            db.SaveChanges();

            result.SetSuccessStatus("Insert Success!");
        }
        catch (Exception ex)
        {
            result.SetErrorStatus(string.Format("Insert Failed! Cause : {0}", ex.Message));
        }

        return result;
    }

    //other methods
}
依我看,真是一团糟。我见过有人使用更简单的方法来实例化它,如:

public partial class Default : System.Web.UI.Page
{
    IUserService userService { get; set; }
}

当我这样实例化它时,我得到一个空的userService。我怎样才能做到这一点呢?

不确定您是否听说过依赖注入,它可能会有所帮助。有许多不同的DI容器可用于(Unity、Ninject、Autofac等)一些关于DI和松耦合的文章:

您应该将依赖注入控制器构造函数

IPostRepository _repository;
    public PostsController(IPostRepository repository)
    {
      _repository = repository;
    }
您可以通过construnctor向依赖项注入一个IOC容器(作为Ninject,您可以通过NUGet包下载)

Ninject.Web.PageBase

public partial class Default : PageBase
        {
            [Inject]
            public IPostRepository _postRepository { get; set; }

            protected void Page_Load(object sender, EventArgs e)
            {
                Post post = _postRepository.Get(int postId);
            }

        }

看看第二个版本,您只是声明了它,并没有创建它的实例。请注意setter,可以从类外部设置属性,这正是使用依赖项注入设置属性的方式。您的答案是演示如何在ASP.NET MVC控制器中使用构造函数注入。看看这些例子,我猜OP使用的是ASP.NETWebForms,所以构造函数注入并不是一个真正的选项。因此,给定的示例使用属性注入。你能更新你的例子来使用属性注入吗?这篇文章让我回答这个问题,有了更新版本的Ninject,我可以像这篇文章一样实现它
  private static void RegisterServices(IKernel kernel)
    {
      kernel.Bind<IPostRepository>().To<PostRepository>();

    }
public class Global : NinjectHttpApplication

    protected override IKernel CreateKernel()
    {
        IKernel kernel = new StandardKernel(new YourModule());
        return kernel;
    }

public class YourModule: Ninject.Modules.NinjectModule
    {

        public override void Load()
        {
            Bind<IPostRepository>().To<PostRepository>();
        }  
    }
public partial class Default : PageBase
        {
            [Inject]
            public IPostRepository _postRepository { get; set; }

            protected void Page_Load(object sender, EventArgs e)
            {
                Post post = _postRepository.Get(int postId);
            }

        }