2011-10-16 29 views
11

Tôi đang cố gắng tự động đặt thuộc tính trên bất kỳ bộ điều khiển nào xuất phát từ lớp BaseController của tôi. Đây là mã trong phương thức Application_Start của tôi. Các tài sản UnitOfWork luôn luôn là null khi tôi cố gắng và truy cập nó.Tiêm tài sản cho Bộ điều khiển cơ sở Lớp

var builder = new ContainerBuilder(); 
builder.RegisterControllers(typeof(MvcApplication).Assembly); 
builder.RegisterType<VesteraTechnologiesContext>().As<IContext>(); 
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>(); 
builder.RegisterType<BaseController>() 
     .OnActivated(c => c.Instance.UnitOfWork = c.Context.Resolve<IUnitOfWork>()); 
var container = builder.Build(); 
DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 

Dưới đây là những gì trông giống như BaseController

public class BaseController : Controller 
{ 
    public IUnitOfWork UnitOfWork { get; set; } 
} 

Lý do tôi đang cố gắng để thực hiện điều này thông qua một tài sản thay vì trên thông qua một constructor là vì vậy mà tôi không cần phải lặp lại trong các nhà xây dựng trong mọi bộ điều khiển cần quyền truy cập vào thuộc tính UnitOfWork, vì các hàm tạo không được kế thừa.

Trả lời

14

Autofac theo mặc định đăng ký các bộ điều khiển sử dụng constructor injection. Để bật property injection with autofac: bạn nên sử dụng:

builder.RegisterControllers(typeof(MvcApplication).Assembly) 
     .PropertiesAutowired(); 
+0

Cảm ơn bạn nemesv, điều này làm việc hoàn hảo. –

+0

@nemesv cảm ơn mẹo. Bạn có biết rằng nếu điều này có bất kỳ tác động perf? – tugberk

+0

@tugberk Tôi đã không sử dụng PropertiesAutowired trong môi trường sản xuất nên tôi không biết tác động của nó đến mức nào. Nó sử dụng sự phản chiếu để tìm ra các thuộc tính có thể định cư công cộng để nó có ít nhất các chi phí phản chiếu thông thường. – nemesv

-1

vì các nhà xây dựng không được kế thừa.

Thông thường, nó có thể gọi các nhà xây dựng cơ sở như sau:

public DescendantClass() 
    : base() 
{ 
} 
+0

OP sẽ cần một hàm tạo với tham số 'IUnitOfWork'. –

+0

GertArnold là chính xác, và tôi biết tôi có thể xếp tầng các nhà xây dựng, nhưng đây là những gì tôi đang cố gắng tránh. Cảm ơn. –

+0

Có một hàm tạo công khai như thế này không làm gì trừ khi cũng muốn cung cấp một "hàm tạo mặc định" cho một đối tượng với các hàm tạo không mặc định. Hàm khởi tạo cơ sở sẽ tự động được gọi bởi hàm tạo mặc định "ngầm định". – user2246674

Các vấn đề liên quan