0

嗨統一配置錯誤很努力,它使用依賴注入模式的控制檯應用程序,我創建的界面就像在控制檯應用程序

public interface IRecurringTransactionPlanDataService : IService<RecurringTransactionPlan> 
    { 
    IQueryable<RecurringTransactionPlan> RecurringTransactionPlanData(); 
    } 

和類實現爲

public class RecurringTransactionPlanDataService : Service<RecurringTransactionPlan>, IRecurringTransactionPlanDataService 
{ 
    private readonly IRepositoryAsync<RecurringTransactionPlan> _repository; 

    public RecurringTransactionPlanDataService(IRepositoryAsync<RecurringTransactionPlan> repository) 
     : base(repository) 
    { 
     _repository = repository; 
    } 

    public IQueryable<RecurringTransactionPlan> RecurringTransactionPlanData() 
    { 
     return _repository.RecurringTransactionPlanData(); 
    } 
} 

存儲庫:

public static class RecurringTransactionPlanRepository 
{ 
    public static IQueryable<RecurringTransactionPlan> RecurringTransactionPlanData(this IRepository<RecurringTransactionPlan> repository) 
    { 
     return repository.Queryable(); 
    } 
} 

上面的代碼都在單獨的項目中,我在MVC中使用這個在控制檯應用程序,而使用MVC沒有錯誤從數據庫由UnityConfig.cs讀取數據,但在控制檯應用程序,我們需要手動註冊和解析接口,我已經試過了,

我的控制檯應用程序:

public class RecurringTransaction 
{ 
    public readonly IRecurringTransactionPlanDataService _recurringTransactionPlanDataService; 

    public RecurringTransaction() 
    { 
     var container = new UnityContainer(); 
     container.RegisterType<IRecurringTransactionPlanDataService, RecurringTransactionPlanDataService>(); 
     _recurringTransactionPlanDataService = container.Resolve<IRecurringTransactionPlanDataService>(); 

    } 
} 

public class Program 
{ 
    public static void Main(string[] args) 
    { 

     FeePaymentTracker.UnityConfig.RegisterComponents(); 

     RecurringTransaction rt = new RecurringTransaction(); 
     var restult = rt.GetRecurringTransactionRecords(); 
    } 
} 

enter image description here

我得到上述錯誤。期待您的想法來解決錯誤。

+2

您正在使用Service Locator模式,而不是依賴注入。您需要展示如何使用Unity註冊您的類型。我的例子中甚至沒有看到「RecurringTransactionPlanDataService」類型的任何地方。 – Crowcoder

+0

請看編輯 – Ranjith

回答

1

在你RecurringTransaction - 方法創建一個新的容器中,然後你在新的容器註冊RecurringTransactionPlanDataService。但是您不註冊執行RecurringTransactionPlanDataService所具有的依賴關係。該容器只有一個註冊。

var container = new UnityContainer(); 
container.RegisterType<IRecurringTransactionPlanDataService, RecurringTransactionPlanDataService>(); 
_recurringTransactionPlanDataService = container.Resolve<IRecurringTransactionPlanDataService>(); 

由於RecurringTransactionPlanDataService有一個依賴於你需要註冊以及IRepositoryAsync<RecurringTransactionPlan>

你的代碼更改爲:

var container = new UnityContainer(); 
container.RegisterType<IRecurringTransactionPlanDataService, RecurringTransactionPlanDataService>(); 
container.RegisterType<IRepositoryAsync<RecurringTransactionPlan>, YourRepositoryImplementation>(); 
_recurringTransactionPlanDataService = container.Resolve<IRecurringTransactionPlanDataService>(); 

你可能要重新使用同一容器阿里納斯。在控制檯應用程序中,我通常會解析一個「ProgramStarter」,然後獲得正確的注入。這樣您只需要在根目錄中使用服務定位器反模式。但是可以在應用程序的其餘部分使用適當的DI。

class Program 
{ 
    static void Main(string[] args) 
    { 
     var container = new UnityContainer(); 
     container.RegisterType<ProgramStarter, ProgramStarter>(); 

     // Pass the same container to the config. 
     FeePaymentTracker.UnityConfig.RegisterComponents(container); 
     var program = container.Resolve<ProgramStarter>(); 
     program.Run(); 
    } 
} 

public class ProgramStarter 
{ 
    IRecurringTransactionPlanDataService _dataService; 
    public ProgramStarter(IRecurringTransactionPlanDataService dataService) 
    { 
     _dataService = dataService; 
    } 

    public void Run() 
    { 
     // Do stuff. 
    } 
} 
1

在您發佈的代碼中,您有一個名爲IPaymentService的接口及其實現。看起來沒問題。但是在屏幕截圖中,您正嘗試解析名爲RecurringTransactionPlanDataService的依賴項。讓你注意到這個依賴。你能否添加關於如何在容器中註冊依賴關係的信息?

代碼中的問題在於,您試圖解析實現而不是接口。你應該更改以下行:

_recurringTransactionPlanDataService = container.Resolve<RecurringTransactionPlanDataService>(); 

與:

_recurringTransactionPlanDataService = container.Resolve<IRecurringTransactionPlanDataService>(); 

乾杯,

+0

我修改了界面名稱以便於理解,請考慮屏幕截圖本身的錯誤** ResolutionFailedException **, – Ranjith

+0

您可以在容器中顯示註冊組件的位置?你能添加更多關於異常的信息嗎? –

+0

我也添加了我的控制檯應用程序 – Ranjith