简体   繁体   English

C#使用接口访问方法

[英]C# Using Interface To Access Methods

I have some interfaces and classes in "repository" and "services" and say if I going to use FindBy method, I would call FindBy method in IUserService which would end up in FindBy method in UserRepository. 我在“存储库”和“服务”中有一些接口和类,并说如果我要使用FindBy方法,我将在IUserService中调用FindBy方法,最终将在UserRepository中的FindBy方法中使用。 The interfaces and classes look like this : 接口和类如下所示:

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
}

The problem is, I can only get it to work by instantiating it like this in aspx.cs : 问题是,我只能通过在aspx.cs中实例化它来使其工作:

public partial class Default : System.Web.UI.Page
{
    IUserService userService = new UserService(new UserRepository());
}

IMO, it such a mess. 海事组织,真是一团糟。 I've seen someone use a much more simpler way to instantiate it like : 我见过有人使用一种更简单的方法实例化它,例如:

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

When I Instantiate it like that, I get a null userService. 当我像这样实例化它时,我得到一个空的userService。 How can I do it that way? 我该怎么做?

Not sure if you ever heard about Dependency Injection, it might be helpful. 不知道您是否听说过依赖注入,它可能会有所帮助。 There are a lot different DI Containers which can be used to that (Unity, Ninject, Autofac etc.) Some article about DI and Loose Coupling: http://joelabrahamsson.com/inversion-of-control-an-introduction-with-examples-in-net/ 有很多不同的DI容器可用于此(Unity,Ninject,Autofac等)。一些有关DI和松散耦合的文章: http ://joelabrahamsson.com/inversion-of-control-an-introduction-with- 实例-在网/

you should inject your dependency on the controller constructor 您应该将对控制器构造函数的依赖注入

IPostRepository _repository;
    public PostsController(IPostRepository repository)
    {
      _repository = repository;
    }

You can inject your dependency via construnctor with a IOC Container (as Ninject, wich you can download via NUGet package) 您可以通过带有IOC容器的construnctor注入依赖项(就像Ninject一样,可以通过NUGet包下载)

  private static void RegisterServices(IKernel kernel)
    {
      kernel.Bind<IPostRepository>().To<PostRepository>();

    }

EDIT 编辑

Web Form version 网络表格版本

Inherit Global(asax) from NinjectHttpApplication and override CreateKernel method NinjectHttpApplication继承Global(asax)并重写CreateKernel方法

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>();
        }  
    }

Derive your pages from Ninject.Web.PageBase 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);
            }

        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM