2016-04-03 29 views
1

私は依存関係インジェクションを実装しようとしていますが、クラスのインターフェイスとリポジトリを実装する方法を知っています。 この私のサンプル:これは私のインタフェースであるmvcで依存関係注入を実装する方法は?

public class User 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string LastName { get; set; } 
} 

は:

public class UserRepsitory:IUser 
{ 
    private _Context _context; 
    public UserRepsitory(_Context _context) 
    { 
     this._context = _context; 
    } 
    public IEnumerable<User> GetUsers() 
    { 
     return _context.User.ToList(); 
    } 
    public void AddUser(User user) 
    { 
     _context.User.Add(user); 
    } 
    public void EditUser(User user) 
    { 

     _context.Entry(user).State = System.Data.Entity.EntityState.Modified; 
    } 
    public User UserGetById(int id) 
    { 
     return _context.User.Find(id); 
    } 
    public void Save() 
    { 
     _context.SaveChanges(); 
    } 
    public void DeleteUser(int id) 
    { 
     var Search = _context.User.Find(id); 
     _context.User.Remove(Search); 

    } 
} 

とコントローラのメソッドの1:

private IUser userRepsitory; 

    public UsersController() 
    { 
     this.userRepsitory = new UserRepsitory(new _Context()); 
    } 

    public UsersController(IUser UserRepository) 
    { 
     this.userRepsitory = UserRepository; 
    } 

    public ActionResult Index() 
    { 
     return View(userRepsitory.GetUsers()); 
    } 

public interface IUser 
{ 
    IEnumerable<User> GetUsers(); 
    void AddUser(User user); 
    void EditUser(User user); 
    void DeleteUser(int id); 
    User UserGetById(int id); 
    void Save(); 
} 

これは私のリポジトリです次のステップは何ですか?

答えて

1

最初のことは、デフォルトのコンストラクタを取り除いて、ここでは初期設定のハードコードをUserRepositoryにコーディングしています!依存注入方式でこれを行います。

public UsersController : Controller 
{ 
    private readonly IUser userRepsitory; 
    public UsersController(IUser UserRepository) 
    { 
     this.userRepsitory = UserRepository; 
    } 

    public ActionResult Index() 
    { 
     return View(userRepsitory.GetUsers()); 
    } 
} 

今、私たちは、コードが実行されるときにIUserのバージョン/実装が使用されるべきであるMVCフレームワークを伝えるために何かを必要としています。どのような依存性注入フレームワークを使ってもそれを行うことができます。たとえば、MVC 6の場合は、inbuilt dependency injection frameworkを使用してこれを行うことができます。だからあなたのStartupクラスに行き、あなたのConfigureServicesメソッドでは、具体的な実装にインターフェイスをマップすることができます。あなたはMVCの以前のバージョンである場合は、ユニティのように利用できる依存性注入フレームワークのいずれかを使用して検討すること

public class Startup 
{ 
    public void ConfigureServices(IServiceCollection services) 
    { 
    services.AddTransient<IUser, UserRepository>(); 
    } 
} 

、Ninjectなど

それはあなたがへのインターフェイスをマッピングし、ほとんど同じです具体的な実装

Ninject

private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<IUser>().To<UserRepository>(); 
} 

あなたにはマッピングを配置する必要はありませんcsファイル。設定ファイルでそれを定義することができます。あなたはユニティを使用する場合たとえば、あなたはあなたの設定ファイル(Web構成や団結構成のための外部設定ファイル)にこのような何かを行うことができ

ユニティ

<alias alias="IUser" type="YourNamespace.IUser, YourAssemblyName" /> 
<register type="IUser" mapTo="YourNamespace.UseRepository, YourAssemblyName"> 
+0

この後、私はスタンドアップクラスを呼び出す必要がありますか? –

+0

@salehazami ASP.Netのどのバージョンを使用しているかを判断することは本当に重要です。 DIを実装する多くのフレームワーク(MicrosoftとOthertype)があります。実装する前に、この質問を簡略化するために1つを選択する必要があります。 –

+0

ありがとう私はASP.NET MVC 5を使用しています –

0

あなたを作成および構成するにはSpring DI(Dependency Feature)プロジェクトでBeanを設定する必要があります。 Create an xml file (if its not there) and add references to bean

このxmlファイルには、注入するクラスへの参照を指定します。例:

<bean id="Name of the JAVA Class" class="the Full path of the JAVA class"/> 

そして、あなたのクラスであなたが(上記)参照元のクラスを呼び出すことになっている、プロシージャを呼び出すと、同じようになります:あなた場合

@Controller 
public class MyController { 

private full.path.of.my.class.named.MyJavaClass _class; 

@Autowired 
private MyController (full.path.of.my.class.MyJavaClass class) 
{ 
     this._class= class; 
} 
} 

今MyJavaClass

で関数を言います
public int sum(int x, int y){ 
return x+y; 
} 

MyJavaClassのオブジェクトを作成せずに、コントローラに次のように注入することができます。

_class.Sum(10,15); 

このクラスのインスタンスを作成しないでください。

関連する問題