Dependency injection trong WCF

Hôm nay mình muốn chia sẻ với các bạn về cách sử dụng dependency injection trong WCF. Đây là 1 chủ đề mà mình khá là thích và dạo này đang tìm hiểu khá nhiều vì ở công ty mình đang sử dụng WCF cho việc kết nối ứng dụng khá nhiều tuy nhiên cách làm nó hơi thủ công 😀 (kiểu như bài lần trước của mình)

Hiện tại thì nếu bạn nào chưa biết dependency injection là gì thì có thể tham khảo link blog

https://toidicodedao.com/2015/11/03/dependency-injection-va-inversion-of-control-phan-1-dinh-nghia/

Đây là 1 blog khá ưa thích của mình, mặc dù người viết nhỏ tuổi hơn mình nhưng mình rất khâm phục các kiến thức của cậu này. Mọi người có thể vào đọc và tìm hiểu nhiều hơn các bài viết trong blog đó :3

Khi bạn áp dụng DI cho thằng WCF thì có nhiều tác dụng (thực ra thì thằng nào cũng thế =)) )

  1. Giảm sự gắn kết của các class với nhau
  2. Tăng khả năng sự dụng lại code
  3. Cải thiện khả năng bảo trì code
  4. Đặc biệt là tăng khả năng test được

Hiện tại thì có rất nhiều thư viện hỗ trợ cho việc sử dụng DI như Autofac , NInject, Unity.. Trong bài viết này mình chia sẻ cách làm với Ninject nhé :3 (vì trộm source được =)) ). Các thư viện kia thì tương tự các bạn có vào các trang chủ của nó để xem cách cài đặt.

Sourcecode ở trên github nhé https://github.com/hoangnl/DependencyInjectionInWCF/

Ở đây thì có đoạn cài đặt interface

public interface IRepository
{
int GetCategory();
}

public class RealRepository : IRepository
{
public int GetCategory()
{
return 1;
}
}

public class MockRepository : IRepository
{
public int GetCategory()
{
return 10;
}
}

public class FakeRepository : IRepository
{
public int GetCategory()
{
return 100;
}
}

Để inject 1 class vào thì ta cài đặt thằng NinjectModule. Trong thằng này mình sẽ quy định thằng class nào được inject cho thằng interface. Ở đây mình sẻ cho thằng FakeRepository nhé

public class WCFNinjectModule : NinjectModule
{
public override void Load()
{
 Bind<IRepository>().To<FakeRepository>();
}
}

Trong file Global.asax thì mình quy định cho thằng Ninject nhé. Cái này là cú pháp của nó thôi các bạn làm theo là được

public class Global : NinjectWcfApplication
 {
 protected override IKernel CreateKernel()
 {
 return new StandardKernel(new WCFNinjectModule());
 }
}

Còn trong cái phần cài đặt service thì cái hàm khởi tạo phải nhét thêm thằng Interface vào nhé

private readonly IRepository _repo;

        public Service1(IRepository repository)
        {
            _repo = repository;
        }

        public string GetData(int value)
        {
            return string.Format("You entered: {0} _ {1}", value, _repo.GetCategory());
        }

Đoạn quan trọng nhất là thêm cái Factory trong file svc nữa là được

&lt;%@ ServiceHost Language="C#" Debug="true" Service="wcf_ninject.Service1" CodeBehind="Service1.svc.cs" Factory="Ninject.Extensions.Wcf.NinjectServiceHostFactory" %&gt;

Code này mình lấy trên mạng lên chạy chuẩn rồi nhé =))
Các bạn có thể tham khảo thêm các link sau nhé. Mấy cái đó phức tạp quá nên mình sẽ giới thiệu sau, bạn nào tự đọc được thì cứ thoải mái :3

https://chsakell.com/2015/07/04/dependency-injection-in-wcf/

http://scotthannen.org/blog/2016/04/13/wcf-dependency-injection-in-5-minutes.html

http://www.c-sharpcorner.com/UploadFile/f1047f/wcf-service-injection-in-controller-using-castle-windsor/

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s